728x90
함수 포인터
지금까지 우리는 포인터를 주로 변수를 가르키는데 사용했다.
하지만, 포인터는 함수도 가르킬 수 있다.
함수도 실행되는 주소를 가진다.
일반적인 포인터는 변수가 저장되어있는 주소를 가르키지만, 함수 포인터는 함수가 시작되는 주소를 가르킨다.
함수 포인터는 이렇게 선언한다.
int (*pf)(int, int);
int형이고 매개변수로 int, int를 갖는 함수 포인터 pf.
라는 뜻이다.
예를들어, sub함수를 정의하고 sub함수를 가르키는 함수포인터를 설정해보자.
int sub(int, int); //함수원형 정의
int (*pf)(int, int); //함수 포인터 정의
pf = sub; //함수의 이름을 함수 포인터에 대입.
어려울 것이 없다.
여기서 눈여겨 봐야할 점은, pf = sub로 주소를 대입할때 주소연산자 &를 사용하지 않았다.
이는, 함수의 이름이 함수의 시작 주소를 갖는다 라는 것!
함수 포인터가 특정한 함수를 가르키게 했다면,
이젠 함수 포인터를 이용해서 함수를 호출 해보자.
result = (*pf)(10, 20);
함수를 호출하고, 그 리턴값을 result에 할당했다.
(*pf)는 sub와 같다. 왜냐면 *는 가르키는 것(참조 연선자)로 *pf는 포인터 pf가 가르키는 것. 이라는 뜻이기 때문이다.
간단한 예제를 살펴보자.
#include <stdio.h>
int add(int, int);
int sub(int, int);
int main(void)
{
int (*p)(int, int);
int result;
p = add;
result = (*p)(10, 20);
printf("%d\n", result); //30출력
p = sub;
result = (*p)(30, 10);
printf("%d\n", result); //20출력
return 0;
}
int add(int a, int b)
{
result a + b;
}
int sub(int a, int b)
{
result a - b;
}
함수 포인터 p를 선언한 후, add함수를 가르키고 인수에 10, 20을 넣는다.
그리고 sub함수를 가르키고 인수에 30, 10을 넣는다.
그리고 값을 출력해본다.
728x90
'C프로그래밍 > 개인 공부' 카테고리의 다른 글
함수에서 인자를 포인터로 받으면 무조건 원본 변경이 될까? (0) | 2023.05.17 |
---|---|
2차원 배열 포인터 형으로 함수 인자로 전달하기 (0) | 2023.02.12 |
C언어 - 포인터의 배열, 배열의 포인터 (0) | 2023.01.05 |
C언어 - 이중 포인터 (0) | 2023.01.03 |
C언어 - 연결리스트 (0) | 2022.12.20 |