[C++] 함수 포인터
C∫C++ 2017. 4. 14. 14:25
포인터 변수는 다른변수의 주소를 보관한다.
변수가 메모리에 위치하고, 각 메모리 공간마다 주소를 가지고 있기에 가능한 일이다.
변수를 가리키는 포인터라면 변수에서 값을 읽거나, 값을 쓰는 용도로 사용할 수 있다.
하지만, 함수의 경우는 그런 작업이 불가능하다. 대신 함수의 포인터를 사용해서는 그 함수를 호출할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #include <iostream> using namespace std; void Cat(); void Dog(); void main() { void (*p)(); p = &Dog; (*p)(); p = &Cat; (*p)(); } void Cat() { printf("야옹\n"); } void Dog() { printf("멍멍\n"); } | cs |
결과
함수역시 메모리 어딘가에 보관된다.
하지만 일반적으로 변수들을 보관하는 메모리 공간과 함수들을 보관하는 메모리 공간이 어느 정도 떨어져 있게 된다.
어쨌든, 변수 p에는 Dog()의 시작주소가 들어가게 된다.
변수에 대한 포인터에 경우 그 포인터가 가리킬 수 있는 타입을 따로 지정해주었다.
함수 포인터도 마찬가지다. 포인터가 가리킬 수 있는 함수의 종류를 지정해 주어야 한다.
함수의 종류란 함수의 반환 값과 시그니처를 의미한다.
※시그니처란?
void Point(int a, int b);
이러한 함수가 있다고 하자.
함수의 시그니처란 함수의 원형에서 인자 부분을 의미한다. (int a, int b)
Point함수의 시그니처는 어떻게 되지? 라고 물어본다면, 정수 타입 2개만 받으면 된다.
라고 답변 해주면 된다.
반환 값, 인자가 있는 함수 포인터는 어떻게 쓸까?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include <iostream> using namespace std; int Cat(int a, char *b); void main() { char b[] = "야옹"; int (*p)(int,char*); p = &Cat; (*p)(5,b); } int Cat(int a, char *b) { for(int i = 0; i < a; i++) printf("%s\n",b); return a; } | cs |
결과
※ 배열의 이름은 주소를 의미한다.
마찬가지로 함수의 이름은 주소를 의미한다.
그렇기 때문에 p = Dog;도 가능하다.
하지만 이 문장이 Dog의 주소를 얻고있는 것이라고 알아보기 힘들기 때문에 지양하도록 하자.
'C∫C++' 카테고리의 다른 글
[STL] 템플릿을 이용해 Stack Calss 만들기. (0) | 2017.04.15 |
---|---|
객체지향. (0) | 2017.01.15 |