본문 바로가기
프로그래머의 길/C & C++

함수 포인터 & void 포인터 변수 & typedef

by 제이콥케이 2007. 3. 13.
반응형
 

@ 함수 포인터

#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); 와 같이 간단하게 쓸 수 있다.

반응형