@ 함수 포인터
#include <stdio.h>
int sum(int a, int b);
void func(int (*fp)(int p, int q));
int main()
{
func(sum);
return 0;
}
int sum(int a, int b) // 내가 남에게 보여주고 싶지 않은 소스
{
return a+b;
}
//////////////////////////////////////////////////// 상대방이 사용하는 소스
void func(int (*fp)(int p, int q))
{
int a, b, res;
scanf("%d%d", &a, &b);
res=fp(a, b); // 내가 곱샘으로 바꾼다면 곱셈 연산을 실행한다.
printf("%d\n", res);
}
@ void형 포인터
void형 포인터란 자료형에 대한 정보가 제외된, 주소 정보를 담을 수 있는 형태의 변수
이며, 포인터연산 메모리참조와 관련된 일에 활용할 수 있다.
예)
int main(void) int main(void)
{ {
char c='a'; int n=10;
int n=10; void *vp=&n;
void *vp; *vp=20; //error 사용하고 싶다면 강제 형변환을 해줘야 한다.
vp=&c; vp++; //error *(int *)vp=20;
vp=&n; }
}
위 예제를 보면은 void 형 포인터를 선언한 후 char 형 및 int 형등의 자료형태
변수들을 자유롭게 연결 및 사용을 하고있다.
이 처럼 void형 포인터는 자료형태가 없기때문에 어느 자료형이든 담을 수 있다는
장점이 있다. 하지만 단점으로는 옆 예제처럼 변수주소값을 받은 후 값 변경 및
수정을 할 때 에러가 발생함을 알 수 있습니다. 이 부분은 void형 포인터에 자료형이
없기때문에 값을 저장할 시 해당 자료형태를 모르기때문에 에러가 발생되는 것이다.
@ typedef
int (*fp)(int r, int s) (int (*p1)(int a, int b), int (*p2)(int p, int q) ) ;
/////원래는 위와같이 선언해야하나 아래와 같이 표기 한다. ///////
int (*fp (int (*p1)(int a, int b), int (*p2)(int p, int q) ) ) (int r, int s);
<-- 함수 포인터를 매개변수로 받아서 함수 포인터를 리턴하는 함수
이와 같은 경우 복잡하기 때문에
typedef int (*FP)(int, int); <== 이렇게 정의 해주면 변수명을 형태명으로 쓸수 있다.
FP fp(FP, FP); 와 같이 간단하게 쓸 수 있다.
'프로그래머의 길 > C & C++' 카테고리의 다른 글
문자열 함수 strtok 예제 (0) | 2007.03.19 |
---|---|
동적 할당 관련 함수 malloc, calloc, realloc, free (0) | 2007.03.13 |
2차원 배열 처럼 사용할 수 있는 배열과 포인터형 배열의 조합 (0) | 2007.03.12 |
2차원 배열 매개변수로 받는 방법 (0) | 2007.03.09 |
extern, static 이란? (0) | 2007.03.09 |