우리는 컴파일러가 하는 작업이 우리가 인간에 친숙한 언어로 쓰여진 프로그램 코드를 컴퓨터에 친숙한 언어, 즉 수 데이터들로 바꿔주어 실행 파일을 생성한다고 배웠다. 이렇게 바뀐 실행 파일을 실행하게 되면 프로그램의 수 코드가 메모리 상에 올라가게 된다. 다시말해, 메모리 상에 함수의 코드가 들어간다는 것이다. 이때, 변수를 가리키는 포인터 처럼 함수 포인터는 메모리 상에 올라간 함수의 시작 주소를 가리키는 역할을 하게 된다.
그렇다면 함수 포인터가 함수를 가리키기 위해서는 그 함수의 시작 주소값을 알아야 한다. 그런데 배열과 마찬가지로 함수의 이름이 바로 함수의 시작 주소값을 나타낸다.
아래 함수 포인터에 대한 코드를 보자.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
//함수 포인터
int max(int a, int b);
int main()
{
int a, b;
int (*pmax)(int, int);
pmax = max;
scanf("%d %d", &a, &b);
printf("max(a,b) : %d \n", max(a, b));
printf("pmax(a,b) : %d \n", pmax(a, b));
return 0;
}
int max(int a, int b) {
if (a > b)
return a;
else
return b;
return 0;
}
실행 결과
10 15
max(a, b) : 15
pmax(a, b) : 15
int (*pmax)(int, int);
위는 함수 포인터 pmax 의 정의이다. 위 정의를 보고 이 함수 포인터 pmax 는 함수의 리턴값이 int 형이고 인자 두 개가 각각 int 인 함수를 가리키므로 pmax 함수 포인터로 함수를 가리킬 때 그 함수는 반드시 pmax 의 정의와 일치해야 한다.
정의를 간략하게 살펴보자면
(함수의 리턴형)(*포인터 이름)(첫번째 인자 타입, 두번째 인자 타입, ...) //인자가 없는 경우 괄호를 비워둔다
int (*a)()
max 함수를 보면 pmax 의 정의와 일치하므로 max 함수의 시작 주소값을 pmax 에 대입할 수 있게 된다. 이 때, 앞에서도 말했듯이 특정한 함수의 시작 주소값을 알려면 그냥 함수 이름을 넣어주면 된다. pmax = &max 는 틀린 형식이다.
간단히 말하면 아래 코드의 구조와 동일하다고 이해하면 편하다.
int arr[3];
int *p = arr;
arr[2]; //p[2] 와 정확히 일치한다
p[2];

2022.01.26 - [Coding/자료구조(with C)] - 포인터 swap (**pa, **pb)
포인터 swap (**pa, **pb)
일단 전체 코드를 삽입해보겠다. #define _CRT_SECURE_NO_WARNINGS #include int pswap(int** pa, int** pb); int main() { int a, b; int* pa, * pb; pa = &a; pb = &b; printf("pa 가 가리키는 변수의 주소값 :..
semi531.tistory.com
| scanf 의 원리 및 오류 상황에 대한 이해 (1) (0) | 2022.01.30 |
|---|---|
| c 언어 " " 와 ' ' 의 차이점 및 문자열 (0) | 2022.01.27 |
| 포인터 swap (**pa, **pb) (0) | 2022.01.26 |
| 히프 정렬 (0) | 2021.10.31 |
| 히프의 구현 (0) | 2021.10.31 |
댓글 영역