함수포인터
C언어에서는 함수의 이름을 이용해 특정한 함수를 호출한다.
함수 이름은 메모리 주소를 반환한다.
#include <stdio.h>
void function(){
printf("It's my function.");
}
int main(void){
printf("%d\n", function);
system("pause");
return 0;
}
이렇게 함수 이름을 넣어서 출력하도록 하면 함수의 주소값을 확인할 수 있다.
function 함수에 있는 It's my function 이 출력되는 것이 아닌 fucntion 함수의 주소값만이 출력되게 된다.
만약 It's my function 이라는 결과값을 얻고 싶다면 출력문이 아닌 function(); 이렇게 function함수 자체를 호출하면
된다.
함수 포인터를 이용하면 형태가 같은 서로 다른 기능의 함수를 선택적으로 사용할 수 있다.
반환자료형(*이름)(매개변수) = 함수명; 형태로 사용하면 된다.
매개변수 및 반환자료형이 없는 함수 포인터
#include <stdio.h>
void myFunction(){
printf("It's my Function.\n");
}
void function(){
printf("It's Function.\n");
}
int main(void){
void(*fp)()=myFunction();
fp();
fp = function;
fp();
system("pause");
return 0;
}
위 예제에서 main함수를 보면 void(*fp)()=myFunction() 형태로 반환자료형이 void이며 매개변수는 ()로 비워두었다.
결과값은
It's my Function.
It's Function.
이렇게 출력된다.
위 예제는 fp라는 함수 포인터에 myFunction을 넣어준 뒤 fp(); 형태로 myFunction함수를 호출한 뒤에
fp = function 으로 function함수를 정의한 뒤 다시 fp();형태로 function함수를 호출해 출력한 것이다.
매개변수 및 반환자료형이 있는 함수 포인터
#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;
pritnf("%d\n", fp(10, 3));
system("pause");
return 0;
}
위 예제는 반환자료형, 매개변수를 모두 사용한 경우이다.
정수 연산이기때문에 int로 반환자료형을 선언하고 각 함수에서 받는 변수들이 int이므로 매개변수 역시 int로
작성한다.
add함수를 처음 넣어준 뒤 출력문에서 fp(10,3)으로 add함수에 10과 3을 넘겨준다. 그럼 add함수에서는
a + b인 10 + 3의 결과값 13을 리턴해주고 그 리턴된 값을 main함수의 출력문에서 출력해주는 것이다.
그다음 fp를 sub함수로 정의한 뒤 같은 방식으로 처리하여 출력한다.
return으로 연산을 반환함으로 main함수내의 출력문에서 바로 출력할 수 있다.
함수포인터를 반환하여 사용
#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;
}
main함수에서 출력문 내에 process함수를 호출함으로써 process로 넘어가게 된다. process함수에서는
"10과 20의 합"이라는 문자열을 *a로 받고 그 뒤에 있는 int, int로 10 과 20을 받게 된다.
그럼 process에서는 a만을 출력하라고 했기에 "10과 20의 합"을 출력하게 되고 add로 넘어가는데 이때
받아둔 10 과 20을 add함수로 넘겨주게 된다.
그럼 add함수에서는 return 에 작성한 연산으로 두 값을 합하여 return하게 되고 그 반환 값은 main함수의 출력문으로
넘어와서 출력되게 된다.
C의 모든 함수는 내부적으로 포인터 형태로 관리할 수 있고 함수포인터는 자주 사용되지 않지만 알고있으면
컴퓨터 구조를 이해하는데 도움이 된다고 한다.
레퍼런스
패스트캠퍼스 올인원 패키지 - 소프트웨어 베이직
'C' 카테고리의 다른 글
파일 입출력 (0) | 2020.12.30 |
---|---|
구조체 (0) | 2020.12.30 |
동적메모리 할당 (0) | 2020.12.29 |
포인터 배열의 구조 (0) | 2020.12.28 |
전역변수, 지역변수, 정적변수, 레지스터변수, 함수의 매개변수처리 (0) | 2020.12.27 |