C언어 프로그램의 모든 함수는 내부적으로 포인터 형태로 관리할 수 있다.
-함수의 이름을 이용해 특정한 함수를 호출한다. 함수의 이름은 메몸리 주소를 반환한다.
#include <stdio.h>
void function(){
printf("It's my function");
}
int main(void) {
printf("%d\n",function);
system("pause");
return 0;
}
위와 같이 함수의 이름 값을 출력하면 함수가 실행되는 것이 아닌 메모리 주소값이 출력이 된다.
특정한 함수의 반환 자료형을 지정하는 방식으로 선언할 수 있다.
반환 자료형(*이름)(매개변수) = 함수형;
특정한 함수 포인터를 가르키는 함수를 만들 수 있는 것이다.
함수 포인터를 이용하면 형태가 같지만 서로 다른 기능의 함수를 선택적으로 사용할 수 있다.
#include <stdio.h>
void myFunction(){
printf("It's my function");
}
void yourFunction(){
printf("It's your function.\n");
}
int main(void){
void(*fp)() = myFunction;
fp();
fp = yourFunction;
fp();
system("pause");
return 0;
}
void(*fp)() = myfunction;
은 'fp'라는 이름의 함수 포인터를 만드는 것이었다. 그 후에
fp = yourFunction;
으로 함수 포인터를 새로 만들지 않아도 같은 함수 포인터에 다른 함수를 대입할 수 있다.
printf
는 줄바꿈 기능이 없는 함수이다.
#include <stdio.h>
int add(int a, int b){
return a+b;
}
int sub(int a, int b){
return a-b;
}
int main(void){
int(*fp)(int,int) = add;
printf("%d\n",fp(10,3));
fp = sub;
printf("%d\n",fp(10,3));
system("pause");
return 0;
}
결과값
잘 안쓰는 거긴 하다. 그래도 원리는 이해하자.
#include <stdio.h>
int add(int a, int b){
return a+b;
}
int (*process(char* a))(int,int){
printf("%s\n",a);
return add;
}
int main(void){
printf("%d\n",process("10과 20을 더해보겠습니다.")(10,20));
system("pause");
return 0;
}
int (*process(char*a))(int,int)
부분은 process라는 함수 포인터에 a라는 함수 포인터를 만들겠다는 것이다. a라는 함수 포인터는 int형 2개의 매개변수를 받는다는 표현이다.
즉, 이 함수를 풀어보자면 process라는 함수 포인터를 만드는데 그 포인터는 a라는 int형 2개를 포함하는 포인터를 매개변수를 받는다는 것이다.
process : 함수 포인터
process의 매개변수 : a
a : 함수 포인터
a의 매개변수: int,int 즉, int형 2개의 매개변수