개인노트
[C언어] 함수 포인터 변수와 void 포인터 본문
모든 함수는 프로그램 실행 시 메인메모리에 저장이 된다. 배열의 이름이 배열의 시작 주소를 의미하듯
함수의 이름은 함수가 저장된 메모리 공간의 주소값을 나타낸다.
이러한 함수의 주소값 저장을 위한 포인터를 함수 포인터 변수라고 한다.
1. 함수 포인터 선언
int function(int a, int b); // function 함수 int (*ptr)(int, int) = function; // 함수 포인터 void smiple(int * ptra); void (*ptr)(int *) = simple; |
2. 매개변수를 함수 포인터 변수로 선언하여 함수 호출
#include <stdio.h> #include "stdlib.h" int WhoisFirst(int age1, int age2, int(*cm)(int n1, int n2)) { return cm(age1, age2); } int Older(int age1, int age2) { if (age1 > age2) return age1; else if (age1 < age2) return age2; else return 0; } int Younger(int age1, int age2) { if (age1 > age2) return age2; else if (age1 < age2) return age1; else return 0; } int main(void) { int age1 = 10; int age2 = 20; int first; printf("늙은 순서로 입장\n"); first = WhoisFirst(age1, age2, Older); printf("%d세와 %d세 중 %d세가 먼저 입장.\n",age1, age2, first); printf("\n어린 순서로 입장\n"); first = WhoisFirst(age1, age2, Younger); printf("%d세와 %d세 중 %d세가 먼저 입장.\n", age1, age2, first);
return 0; } |
변수 first에 순서를 정하는 WhoisFirst 함수를 초기화 시킨 후, WhoisFirst의 매개 변수로 Older와 Younger 함수의 주소 값을 포인터 변수에 저장한 다음 해당 함수의 포인터 변수값을 리턴하여 해당 함수를 실행시키는 효과를 가져온다.
void 포인터
void * ptr; ← 이와 같이 가리키는 대상에 대한 자료형 정보가 없는 포인터 변수를 void 포인터 라고 한다. void 포인터는 어떠한 변수의 주소 값이라도 담을 수 있지만 포인터 연산은 하지 못한다.
예를 들면 아래와 같은 상황이 나온다.
void * ptr = #
ptr = 20; // 컴파일 에러
ptr--; // 컴파일 에러
void 포인터는 주소 값에만 의미를 두고 포인터의 형은 나중에 결정할 때 사용되며
메모리의 동적 할당과 매우 깊은 관계가 있다.
'C > 문법' 카테고리의 다른 글
[C언어] srand를 이용한 난수 출력 (0) | 2017.07.12 |
---|---|
[C언어] main 함수의 인자 전달 (0) | 2017.07.07 |
[C언어] 2차원 배열의 arr[i] = *(arr+i) 공식 (0) | 2017.07.06 |
[C언어] 2차원배열을 함수의 인자로 전달하기 (0) | 2017.07.06 |
[C언어] 포인터 배열과 배열 포인터의 차이점 (0) | 2017.07.06 |