상세 컨텐츠

본문 제목

[C언어]함수포인터(Function Pointer).

Language/C

by Computer_x86_64 2022. 2. 27. 23:40

본문

 

함수 포인터(Function Pointer)

포인터에 

포인터, 더블포인터, 포인터배열, 배열포인터, 함수 포인터, const 포인터, void 포인터 가 있다.

오늘은 함수 포인터를 정리한 내용이다. 

 

앞에 포인터, 더블포인터는 이해했다면 함수 포인터도 이해하기 쉽다.

1. 함수의 반환탑입이 같아야한다.

2. 함수의 매개변수가 같아야한다.

 

이 두가지사항만 알고있다면 된다. 

함수포인터도 함수의 주소를 담는 그릇인 것이다.

 

#include <stdio.h>

void echo() {
	printf("hello C World\n");
}

int add(int a, int b) {
	printf("%d\n", a + b);
	return a + b;
}
int main() {

	/* Function Pointer */
	void (*fp)();
	fp = echo;
	fp();
	printf("function address is %p\n", &echo);  //0x7fffffffe960
	printf("function pointer is %p\n", &fp);  //0x40059d
	printf("function pointer is %p\n", fp);  //0x40059d

	int (*fp2)(int, int);
	fp2 = add;
	fp2(3, 6);

	return 0;
}

result > 

hello C World
function address is 0x40059d
function pointer is 0x7fffffffe960
function pointer is 0x40059d
9

* 해당 소스를 그대로 복사 해서 실행하시더라도 주소같은 랜덤하게 나올수있습니다...

void echo() {
	printf("hello C world\n");
}
//함수의 반환타입
//함수의 매개변수를 맞춘다.
void (*pf)();
fp=echo;



//함수의 반환타입.
//함수의 매개변수 
int add(int a, int b){
	printf("%d\n",a+b);
    return a+b;
}
int (*fp2)(int, int)
fp2=add;

 

assembly&nbsp;

디버그 모드로 한행식 출력하고 디스어셈블 코드를 같이보면 해당 주소값을 보실수 있습니다.

 

해당 포인터 함수는 함수의 매개변수로 들어갈경우 많이 사용한다고 한다.

java 에서 인터페이스를 생각하면된다는데...

 

그래서 한번 구현해 보았다.

#include <stdio.h>

int add(int a, int b) {
	printf("%d\n", a + b);
	return a + b;
}

typedef int (*fp)(int, int);

int plus(fp func, int a, int b) { 
	return func(a, b);
}

int main() {
	int num = plus(add, 4, 6);
	printf("num : %d\n", num);
	return 0;
}

result > 10

           num : 10 

 

add를 함수를 plus로 재정의한것이다.

plus로 해 매개변수로 add를 받고 변수를 동일하게 받게 만들었다.

 

 

#include <stdio.h>

int add(int a, int b) {
	printf("%d\n", a + b);
	return a + b;
}

typedef int (*fp)(int, int);

int plus(fp func, int a, int b) { 
	return func(a, b);
}

int plusAdd(fp func, int a, int b, int c) {
	return func(a, b) + c;
}


int main() {

	int num = plus(add, 4, 6);
	printf("num : %d\n", num);

	int num2 = plusAdd(add, 4, 6, 5);
	printf("num2 : %d\n", num2);

	return 0;
}

 

result > 10
           num : 10
           10
           num2 : 15

 

매개변수를 추가했다.

정상적으로 잘 동작한다. 

 

C는 정말...개발자능력에 따라서 어마 어마 하다....

'Language > C' 카테고리의 다른 글

[C언어]포인터 배열(Pointer Array)  (0) 2022.03.01
[C]포인터(pointer)  (0) 2022.02.24

관련글 더보기

댓글 영역