프린세스 다이어리

[C] 함수 포인터 개념과 사용 방법 정리. 본문

C, C++

[C] 함수 포인터 개념과 사용 방법 정리.

개발공주 2021. 9. 30. 12:52
728x90

 

1. 함수 포인터란 

 

함수 또한 다른 자료형처럼 포인터 주소를 가진다. 배열의 이름이 메모리 주소를 반환하는 것처럼, 함수의 이름도 내부적으로 컴퓨터 메모리에 기록이 된다. 함수 포인터는 특정한 함수의 반환 자료형을 지정하는 방식으로 선언할 수 있다. 함수 포인터를 하나 만들어서, 특정한 함수 자체를 가리키도록 할 수 있다. 반환 자료형과 매개변수는 해당 함수가 가지고 있던 것으로 가져와야 한다. 

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

 

#include <stdio.h> 

void func() {
    printf("yess");
}

int main(void) {
    printf("%p \n", func);
}
0x100417f40

이렇게 간단한 함수를 만들고, 함수의 이름을 넣어서 출력하도록 만들면 반환되는 값으로 어떠한 메모리 주소가 출력되는 걸 확인할 수 있다. 함수 포인터를 이용하면 형태가 같은 서로 다른 기능의 함수를 선택적으로 사용할 수 있다.

 

2. 매개변수 및 반환 자료형이 없는 함수 포인터

 

#include <stdio.h> 

void func1() {
    printf("function1!! \n");
}
void func2() {
    printf("function2!!! \n");
}

int main(void) {
    void(*fp)() = func1;
    fp();
    fp = func2;
    fp();
}
function1!! 
function2!!!

void로 반환 자료형을 만들어준 후, 함수 포인터 fp를 만들어서 func1 함수를 가리키도록 한다. 그 fp 함수를 실행하도록 만든 다음에, 다시 func2 함수를 바꿔 가리키도록 하고 fp 함수를 또 실행한다. 즉 형태가 비슷한 func1, func2 함수를 같은 명령어 fp로 불러올 수 있다. 

 

2. 매개변수 및 반환 자료형이 있는 함수 포인터

 

#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, 4));
    fp = sub;
    printf("%d \n", fp(12, 9));
}
14 
3

fp라는 함수 포인터가 int형이 반환되고 int형 2개가 매개변수로 들어오도록 설정해 준다. add함수와 sub 함수의 결과가 각각 출력된다.

 

3. 함수 포인터 자체를 반환하기

 

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

*process라는 함수 포인터를 만들었는데 함수 포인터 자체에 두 개의 int형 매개변수가 있고, 함수 포인터가 add라는 또다른 함수의 포인터를 반환하도록 한다. 

 

printf("%d\n", process("10과 20을 더해보겠습니다.")(10, 20));

process라는 함수 포인터를 불러와서, 내용을 출력하고, 이어서 add 함수를 반환하기 때문에 add함수에 10, 20이 매개변수로 들어간 결과물이 출력이 된다. 

 

10과 20을 더해보겠습니다.
30

 

 

728x90
Comments