함수포인터란?
함수를 저장하는 포인터, 함수 포인터를 주고받거나 함수 포인터로 함수를 호출할 수 있다.
용도
1. 함수를 배열이나 구조체에 넣을 수 있다.
2. 함수자체를 함수의 매개 변수로 넘겨주고, 반환 값으로 가져올 수 있다.
저장될 함수의 반환 값 자료형 (*함수포인터이름)(매개변수);
함수이름은 함수의 메모리 주소이므로 함수 포인터에 저장할려면
함수 포인터 이름 = 저장할 함수 이름
수포인터란?
함수를 저장하는 포인터, 함수 포인터를 주고받거나 함수 포인터로 함수를 호출할 수 있다.
용도
1. 함수를 배열이나 구조체에 넣을 수 있다.
2. 함수자체를 함수의 매개 변수로 넘겨주고, 반환 값으로 가져올 수 있다.
함수 포인터를 응용하면 함수를 고정된 형태가 아닌 데이터 형태로 취급할 수 있습니다. 즉, 함수를 보관하거나 주고받기가 쉬워집니다.
형식
저장될 함수의 반환 값 자료형 (*함수포인터이름)(매개변수);
함수이름은 함수의 메모리 주소이므로 함수 포인터에 저장할려면
함수 포인터 이름 = 저장할 함수 이름
함수 포인터 배열
반환값자료형 (*함수포인터이름[크기])(매개변수자료형1, 매개변수자료형2);
함수포인터 배열을 사용하면 함수 자체를 데이터화하여 반복문을 이용해 함수 호출을 자동화 할 수 있다.
선언하는 동시에 초기화하기
int (*fp[4])(int, int) = {add, sub, div, mul};
함수 포인터를 구조체 멤버로 사용하기
struct Ca함수 lc {
// ↓ 반환값 자료형
int (*fp)(int, int); // 함수 포인터를 구조체 멤버로 지정
}; // ↑ ↖ 매개변수 자료형
// 멤버 이름
접근하기
struct Calc c;
c.fp
add함수 할당하기
c.fp = add // add 함수의 메모리 주소를 구조체 c의 멤버에 저장
함수포인터로 접근하여 add 함수 사용하기
printf("%d", c.fp(10, 20));//30출력
함수 포인터를 함수의 매개 변수로 사용하기
반환값자료형 함수이름(함수포인터반환값자료형 (*함수포인터이름)(함수포인터매개변수자료형1, 함수포인터매개변수자료형2)) { }
함수를 만들 때 매개변수 부분에 함수 포인터를 넣는다
#include <stdio.h>
int add(int a, int b) // int형 반환값, int형 매개변수 두 개
{
return a + b;
}
void executer(int (*fp)(int, int)) // 함수 포인터를 매개변수로 지정
{
printf("%d\n", fp(10, 20)); // 30: 매개변수로 함수 호출
} i
nt main()
{
executer(add); // executer를 호출할 때 add 함수의 메모리 주소를 전달
return 0;
}
함수 포인터를 매개변수로 지정했기 때문에 매개 변수로 함수를 호출할 수 있다
함수의 메모리주소를 전달할 때는 ()를 빼고 이름만 적는다.
함수 포인터를 함수의 반환 값으로 사용하기
함수포인터반환값자료형 (*함수이름(매개변수자료형 매개변수))(함수포인터매개변수자료형1, 함수포인터매개변수자료형2) { }
int (*getAdd(int x, int y))(int, int) // 함수 포인터 반환, int형 매개변수 두 개
{
printf("%d %d\n", x, y); // x, y는 getAdd 함수의 매개변수
return add;
}
int main()
{
printf("%d\n", getAdd(8, 9)(10, 20)); // 8, 9는 getAdd에 전달 /
/ 10, 20은 getAdd에서 반환된 add에 전달
return 0; }
typedef로 함수 포인터 별칭 정하기
'C언어' 카테고리의 다른 글
Byte order (0) | 2020.02.23 |
---|---|
크기가 명시된 정수 자료형 (0) | 2020.02.21 |