함수포인터

  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

+ Recent posts