포인터에
포인터, 더블포인터, 포인터배열, 배열포인터, 함수 포인터, 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;
디버그 모드로 한행식 출력하고 디스어셈블 코드를 같이보면 해당 주소값을 보실수 있습니다.
해당 포인터 함수는 함수의 매개변수로 들어갈경우 많이 사용한다고 한다.
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는 정말...개발자능력에 따라서 어마 어마 하다....
[C언어]포인터 배열(Pointer Array) (0) | 2022.03.01 |
---|---|
[C]포인터(pointer) (0) | 2022.02.24 |
댓글 영역