2015년 7월 12일 일요일

20150713 함수 포인터와 void 포인터

int A=5; // 주소 출력 불가(컴파일 에러?)
char T[]="하이"; // 문자 자체가 주소

Symbol Table
cinst char 이름X 주소

반환형 함수의 이름 매개변수
void add (int a, int b)
{
return a+b; // 값의 반환
}

test(); // test;<-test자체가 함수의 주소

// void test(); // test의 타입 추출(함수의 추출방식)
// void ();
// void ()();
// void (*)();

int (*test())(const char *, ...); // test함수의 원형
int (*(*)())(const char *, ...);
int (*(*tp)())(const char *, ...); // tp 포인터 선언<-가장 어려운 함수포인터

int (*test())(const char *, ...) // printf를 반환하는 함수 (*)<-자리에 변수이름
{
return printf;
}

예제
#include <stdio.h>

int main(void)
{
// void test(); // test의 타입
// void ();
// void ()();
// void (*)();
// void (*tp)(); // 메인함수에서 실제 호출 방식

// int main();
// int ();
// int ()();
// int (*)();
// int (*tp)();

// int printf(const char *, ...); // == int scanf(const char *, ...)
// int (const char *, ...);
// int ()(const char *, ...);
// int (*)(const char *, ...);
// int (*tp)(const char *, ...);

// void (*tp)();
// tp=test; // tp==4byte(tp는 포인터가 되므로 4byte)
// tp(); // ==test();
// *(tp)(); // ==test();

int iNum;
int (*tp)(const char *, ...);
tp=scanf;
tp("%d", &iNum);
tp=printf;
tp("iNum = %d\n", iNum);
/* printf와 scanf의 함수선언 형태가 비슷하므로 하나의 함수추출 방식으로 둘다 사용 가능
char iNum[10];
int (*tp)(const char *, ...);
tp=scanf;
tp("%s", &iNum);
tp=printf;
tp("%s\n", iNum);
*/
return 0;
}

댓글 없음:

댓글 쓰기