본문 바로가기

C언어

함수 포인터

함수포인터란?

함수를 저장하는 포인터, 함수 포인터를 주고받거나 함수 포인터로 함수를 호출할 수 있다.

 

용도

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