컴퓨터 공부/© C

[C언어] 13. 함수 포인터

letzgorats 2021. 2. 14. 04:36

13. 함수 포인터

 

<함수 포인터>

 

- C언어에서는 함수의 이름을 이용해 특정한 함수를 호출한다.

- 함수 이름은 메모리 주소값을 반환한다.(배열도 주소값 반환하는 것처럼)

 

(예제1) 함수이름이 메모리주소를 반환하는 예

#include <stdio.h>

void function() {

        printf("i make a my function.");

}

int main(void) {

        printf("%d\n",function);

        system("pause");
        return 0;
}

(해설) 실행 시켜보면 내가 직접 만든 함수들도 함수이름을 출력하도록 하면 각각 자기의 주소값을 가지고 있는 걸 확인 할 수 있다.

 

- 함수 포인터는 특정한 함수의 반환 자료형을 지정하는 방식으로 선언 할 수 있다.

- 함수 포인터를 이용하면 형태가 같은 서로 다른 기능의 함수를 선택적으로 사용할 수 있다.

 

             반환 자료형(*이름)(매개변수)= 함수명;

 

(예제2) 매개변수 및 반환자료형이 “없는” 함수 포인터

#include <stdio.h>

void myFunction() {

        printf("It's my function.\n");

}


void yourFunction(){

        printf("It's your function.\n");

}

int main(void) {

        void(*fp)() = myFunction;

        fp();

        fp = yourFunction;

        fp();

        system("pause");
        return 0;
}

(해설) myFunctionyourFunction 이라는 두개의 함수를 만들어보자. 이 두 함수는 자료형이 둘 다 void이므로 main함수 안에서는 void로 반환자료형을 만들어주고 포인터함수이름을 fp라 짓고 (*fp)(매개변수)자리에는 매개변수가 없으므로 그냥 비어 준다. 처음에는 myFunction 이라는 함수를 가리키도록 해주고 실행하고, 그 다음에는 yourFunction 으로 가리키는 함수를 바꿔주고 실행시켜보자.

 결과는 Its my function이 나온 다음 Its your function 이 나온다. 똑같이 fp()라고 함수를 불러왔음에도 불구하고 실제로 실행되는 함수는 myFunction() yourFunctio()으로 나뉘어진다는 것이다.

 차례대로 myFunction()함수와 yourFunction()함수가 실행 되는데, 다시 말해서 이렇게 함수 포인터를 이용하면 형태가 비슷한 여러 개의 함수를 같은 명령어로 불러 올 수가 있다는 것이다. (두 함수 모두 단순히 printf문으로 출력만 하는 함수잖아. 비슷한 형태인것같아.)

 

(예제3) 매개변수 및 반환자료형이 “있는 함수

#include <stdio.h>

int Aloo(int a, int b) {

        return a+b;

}

int Salomon(int a, int b){

        return a-b;

}

int main(void) {

        int(*as)(int, int) = Aloo;

        printf("%d\n",as(10,3));

        as = Salomon;

        printf("%d\n", as(10, 3));

        system("pause");
        return 0;
}

(해설) Aloo 함수와 Salomon 함수를 만들어주고 함수 포인터를 만드는데 반환자료형을 int형으로 만들고 총 int2개가 매개변수로 들어온다고 설정해준 이후에 맨처음에 Aloo 함수를 가리키도록 만들고 10 3을 더한 결과를 출력하도록 한다.

 그리고 as함수를 Salomon을 가리키도록 한 다음에 103을 뺀 결과를 출력하도록 하면 13,7이 차례로 나오는 것을 확인 할 수 있다. 이렇게 자료형과 매개변수가 있는 함수에서도 포인터를 이용해서 함수를 바꿔가면서 출력할 수 있는 것이다.

 

(예제4) 함수 포인터 자체를 반환해서 사용하는 방법

#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;
}

(해설) process라는 함수 포인터를 하나 만들었는데 함수포인터 자체에 매개변수가 있고 (int,int) 그 다음에 이제 이 함수 포인터가 add라는 또 다른 함수의 포인터를 반환하도록 만든다(return add).

이 때 이 add같은 경우는 두 개의 매개변수가 들어가도록 만들어준다. 이렇게 되면 매개변수가 여러 개 들어 갈 수 있게 되는데(process("10 20을 더해보겠습니다.")까지가 process에 해당하는 함수 포인터를 불러와서 내용을 출력하고(pintf(%s\n,a)) 이어서 add라는 함수가 반환되기 때문에 그 add함수에는 (10,20)이 차례대로 들어가게 되어서 결과적으로는 문장이 출력된 다음에 , 1020을 더한 값 까지 함께 출력이 된다는 것을 확인할 수 있다. 이처럼, 함수 포인터 자체를 반환할 수가 있다. (add)

 

- 함수 포인터 같은 경우에는 굉장히 고급문법에 해당 되기 때문에 잘 사용되지 않고 잘 필요하지도 않다. 혹여나 필요한 일이 생기면 그 때마다 함수 포인터를 어떻게 사용하는지 검색을 해서 공부를 하면 되니까 반드시 이러한 내용들을 다 암기하고 있을 필요는 없다.

 

(정리)

1) C언어 프로그램의 모든 함수는 내부적으로 포인터 형태로 관리 할 수 있다.

2) 함수 포인터는 자주 사용되지 않지만 알고 있으면 컴퓨터의 구조를 이해하는데 도움을 준다.

반응형