본문 바로가기

함수 포인터

1. 함수의 이름

 

배열의 이름은 배열의 시작주소를 의미한다.

마찬 가지로 함수의 이름은 함수가 저장된 (메모리의) 주소를 의미한다.

 

모든 함수는 프로그램 실행 시 메인 메모리(main memory)에 저장된 후 실행된다. 함수의 이름은 이 때의 주소값을 의미하는 것이다. 또한 배열의 이름이 상수이듯이 함수의 이름도 상수다.

 

 

 

 

2. 함수 포인터 변수의 선언

 

모든 포인터는 포인터 형이 결정되어야 적절한 선언이 가능하다.

다음과 같은 함수가 있다고 하자.

 

int add(int a, int b);

 

이 함수의 반환형 선언은  int 고, 매개변수의 선언은  int a, int b 다.

그렇다면 이 함수의 포인터 형은 무엇일까?

함수의 포인터 형은 반환형과 매개변수의 선언 형태를 기준으로 정해진다.

위 함수의 포인터 선언은 다음과 같다.

 

int (*fptr) (int, int);

 

각각이 의미하는 바는 다음과 같다.

 

int: 반환형 int다.

(*fptr): 함수 포인터다.

(int, int): 매개변수 선언이 int 둘이다.

 

-> fptr은 반환형이 int고 매개변수 선언이 int 둘인 함수 포인터다.

 

이렇게 선언된 함수 포인터 변수에  add  함수의 주소를 저장하려면 다음과 같이 대입 연산자를 사용하면 된다.

 

fptr = add;

 

이렇게 되면 함수 포인터 변수  fptr 과 함수 이름  add 에는 동일한 값이 저장된다. 다만 전자는 변수고 후자는 상수라는 차이만 있을 뿐이다.

 

따라서 다음과 같이  fptr 을 이용해  add  함수를 호출할 수 있다.

 

fptr(2, 3);

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
 
int add(int a, int b);
 
int main()
{
    int (*fptr)(intint= add;
    int a, b;
 
    printf("a: ");
    scanf("%d"&a);
 
    printf("b: ");
    scanf("%d"&b);
 
    printf("Result: %d\n", fptr(a, b));
 
    return 0;
}
 
int add(int a, int b)
{
    return (a + b);
}
cs

 

 

 

함수 포인터 형도 결국 일종의 포인터이므로 매개변수에 올 수 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
 
int max(int a, int b);
int min(int a, int b);
int compare(int a, int b, int(*cmp)(intint));
 
int main()
{
    int a = 5, b = 9;
 
    printf("%d와 %d 중 %d가 더 큽니다.\n", a, b, compare(a, b, max));
    printf("%d와 %d 중 %d가 더 작습니다.\n", a, b, compare(a, b, min));
 
    return 0;
}
 
int max(int a, int b)
{
    return ((a > b) ? a : b);
}
 
int min(int a, int b)
{
    return ((a < b) ? a : b);
}
 
int compare(int a, int b, int(*cmp)(intint))
{
    return cmp(a, b);
}
cs

 

 

 

 

위 예제는 함수 포인터를 통해 함수를 유연하게 호출할 수 있다는 것을 보여준다.

 compare  함수에 일종의 비교기(comparator)를 제공해 그 비교기에 따라 두 수를 비교하는 것이다.

 

 

 

'Programming > C' 카테고리의 다른 글

스트림  (0) 2019.05.01
void형 포인터  (0) 2019.04.15
2차원 배열과 포인터  (0) 2019.04.09
다차원 배열  (0) 2019.04.01
다중 포인터  (0) 2019.03.24