본문 바로가기

C, C++

함수 포인터

함수 포인터는 말 그대로 함수를 가리키는 포인터입니다. 함수 포인터는 다음과 같이 정의합니다.

리턴 타입 (*함수 포인터 명)(인수);
int (*add)(int a, int b);

보다시피 일반 함수 형식에 (*)이 추가된 모습입니다.

int ADD(int a, int b) {
	return a + b;
} 

int main() {
	int (*add)(int a, int b);
    add = ADD;//int (*add)(int a, int b) = ADD;로 정의와 동시에 초기화가능합니다.
    
    printf("%d\n", add(1, 2));
    
    return 0;
}

add는 함수가 아니라 함수 포인터라서 정의되자마자 바로 사용할 수 없고 같은 리턴 타입과 인수를 가진 함수 ADD를 대입시켜야 사용할 수 있습니다.

 

그리고 add는 함수가 아니라 함수 포인터라서 함수를 호출할 때 포인터가 가리키는 값을 가져오는 연산자 *를 사용하여 (*add)(1, 2);(()가 연산자 우선순위가 *보다 더 높아서 괄호가 필요합니다.) 형식으로 호출해야 될 것 같지만 C++는 이를 줄여 쓰는 것을 허용하기 때문에 둘 다 맞습니다.

 

 

함수 포인터를 캐스팅하기 위해서는 (리턴 타입 (*)(인수)) 형식으로 씁니다.

int (*add)(int a, int b); 
int (*abs)(int a); 
add = (int (*)(int, int))abs;//(int (*)(int))를 (int (*)(int, int))로 변환시켜 대입

 

함수 포인터를 함수 인수로 사용할 수 있습니다. 함수 포인터 변수를 함수 인수 자리에 넣어주면 됩니다.

int Calc(int a, int b, int (*add)(int, int)) { 
	return add(a , b);
} 

int ADD(int a, int b) {
	return a + b; 
} 

int main() {
	printf("%d\n", Calc(1, 2, ADD));
    
    return 0;
}

 

리턴 타입이 함수 포인터가 될 수 있는데 형식은 다음과 같습니다.

(함수 포인터의 리턴 타입) (*함수명(인수))(함수 포인터 인수)
int ADD(int a, int b) {
	return a + b; 
} 
int SUB(int a, int b) {
	return a - b; 
} 

int (*Calc(int num))(int, int) {//함수 포인터가 리턴타입인 함수입니다.
	if(num == 0) {
    	return ADD; 
    } else { 
    	return SUB;
    }
}

int main() { 
	int (*add)(int a, int b) = Calc(0);
    
    return 0;
}

'C, C++' 카테고리의 다른 글

goto  (0) 2019.12.27
typedef  (0) 2019.12.24
열거형  (0) 2019.12.21
#pragma warning  (2) 2019.12.20
#pragma once  (0) 2019.12.19