함수 포인터
함수의 이름은 함수가 저장된 메모리 공간을 가리키는 포인터이다.(함수 포인터)
함수의 이름이 의미하는 주소 값은 함수 포인터 변수를 선언해서 저장 할 수 있다.
함수 포인터 변수를 선언하려면 함수 포인터 형을 알아야 한다.
함수 포인터의 형(type)
함수 포인터의 형 정보에는 반환형과 매개변수 선언에 대한 정보를 담기로 약속
즉, 함수의 반환형과 매개변수 선언이 동일한 두 함수의 포인터 형은 일치한다.
함수 포인터형 결정
int SimpleFunc(int num) // 반환형 int, 매개변수 int형 1개
double ComplexFunc(double num1, double num2) // 반환형 double, 매개변수 double형 2개
int SoSimple(int num1, int num2) { .... }
int (*fptr) (int, int); // SoSimple 함수 이름과 동일한 형의 변수 선언
fptr = SoSimple; //상수의 값을 변수에 저장
fptr(3, 4); //SoSimple(3, 4)와 동일한 결과를 보임.
//예제1
#include <stdio.h>
void SimpleAdder(int n1, int n2)
{
printf("%d + %d = %d\n", n1, n2, (n1 + n2));
}
void ShowString(char * str)
{
printf("%s\n", str);
}
void main()
{
char * str = "Function Pointer";
int num1 = 10, num2 = 20;
void(*fptr1)(int, int) = SimpleAdder;
void(*fptr2)(char*) = ShowString;
//함수 포인터 변수에 의한 호출
fptr1(num1, num2);
fptr2(str);
}
//예제2
#include <stdio.h>
int WhoIsFirst(int age1, int age2, int(*cmp)(int n1, int n2)) {
return cmp(age1, age2);
}
int OlderFirst(int age1, int age2) {
if (age1 > age2)
return age1;
else if (age1 < age2)
return age2;
else return 0;
}
int YoungerFirst(int age1, int age2) {
if (age1 < age2)
return age1;
else if (age1 > age2)
return age2;
else return 0 ;
}
void main()
{
int age1 = 20;
int age2 = 30;
int first;
printf("입장순서1\n");
first = WhoIsFirst(age1, age2, OlderFirst);
printf("%d와 %d중 %d가 먼저 입장\n", age1, age2, first);
printf("입장순서2\n");
first = WhoIsFirst(age1, age2, YoungerFirst);
printf("%d와 %d중 %d가 먼저 입장\n", age1, age2, first);
}
형(Type)이 존재하지 않는 void 포인터
void * ptr; // void형 포인터 변수
void형 포인터 변수에는 어떠한 변수의 주소 값이든 담을 수 있다. 하지만, void형 포인터 변수를 가지고는 아무런 포인터 연산도 하지 못한다. 값의 변경이나 참조도 불가능하다.
'4. 프로그래밍 기초 > 4_2 C' 카테고리의 다른 글
[열혈 C프로그래밍] 도전 프로그래밍1 정답 (0) | 2018.12.29 |
---|---|
[열혈 C프로그래밍] 스트림과 문자 입출력 함수 연습문제 (0) | 2018.12.22 |
[열혈 C프로그래밍] 2차원배열과 포인터 연습문제 (0) | 2018.12.22 |
[열혈 C프로그래밍] 이중포인터 연습문제 (0) | 2018.12.22 |
[열혈 C프로그래밍] 다차원 배열 연습문제 (0) | 2018.12.22 |