|
oseb 님이 쓰신 글 :
: *(*(*a[N])())()
:
: 이것을 이해하지 못했다면 무엇을 모르고 있는 것인지요?
: 좀 복잡하네요.
#include<stdio.h>
#include<conio.h>
//---------------------------------------------------------------------------
int* (*Func1())();
int* (*Func1_1())();
int* (*Func1_2())();
int* (*Func1_3())();
int* Func2();
int* Func2_1();
int* Func2_2();
#define N 8
int *(*(*a[N])())() = {Func1,Func1_1,Func1_2,Func1_3,NULL,};
/*
위는 배열 a를 선언/정의한 것이며 해석해보면 아래와 같습니다.
형을 해석할 때는 가장 안쪽 괄호부터 합니다.
*a[N] : 원소수가 N개인 포인터 배열 a
, 이 배열의 각원소인 포인터가 무엇을 가리키느냐는 다음 괄호를 해석.
*() : 포인터를 반환(return)하는 함수
,위의 배열 각 원소가 바로 이 함수형으로 정의된 함수를 가리킴
,그리고 이 함수가 포인터를 반환한다고 했는데 그 포인터가 어떤 것인지는 다음을 해석
int *() : int*를 반환하는 함수
,위의 함수가 반환하는 포인터는 이 함수형으로 정의된 함수를 가리킴.
참고로, 이런 복잡한 형은 거의 사용하지 않습니다.
이해가 잘 안되면 그냥 넘어가시기를 권합니다.
프로그램 경력이 늘면 차츰 쉽게 이해가 됩니다.
다만, 아래 1,2는 알고 계시는게 좋습니다.
1. 포인터 배열과 배열을 가리키는 포인터의 구별
int *arr[16]; 포인터 배열 arr(원소수가 16개이고 각 원소는 포인터(int*))
int (*arr)[16]; 배열(원소수가 16개이고 각원소는 int형)을 가리키는 포인터 변수 arr
2. 포인터를 반환하는 함수와 함수를 가리키는 포인터의 구별
int* Func(float); float형 매개변수 하나를 취하고 포인터를(int*)를 반환하는 함수 Func
int (*Func)(float); 함수(float형 매개변수 하나를 취하고 int를 return)를 가리키는 포인터 Func
3. 어떤 함수가 있을 때 이를 가리키는 포인터 선언/정의 방법
int* Func(float); 함수가 있다고 하면
우선 함수이름 부분을 괄호로 묶습니다: int* (Func)(float);
다음으로 함수이름 바로 앞에 *를 붙입니다: int* (*Func)(float);
마지막으로 이름을 중복되지 않은 원하는 것으로 지정합니다: int* (*pFunc)(float);
4. 특정형으로의 형변환 방법
int* (*Func)(float)로 형변환 하려면
우선 변수의 이름을 지웁니다: int* (*)(float)
전체를 괄호로 묶습니다: (int* (*)(float))
5. typedef
int* (*Func)(float);
위와 같은 형을 만들려면 앞에 typedef를 붙인다음: typedef int* (*Func)(float);
형의 이름을 원하는 것으로 정해주면 됩니다: typedef int* (*FuncPointerType)(float);
*/
//---------------------------------------------------------------------------
typedef int* (*FuncPointerType1)();
int main(int argc, char* argv[])
{
// int* (*pf)();
FuncPointerType1 pf; //바로 윗줄과 동일한 역할
for(int i=0 ;a[i] ;++i)
{
pf=a[i]();
if(pf) pf();
printf("\n");
}
while(kbhit()) getch(); getch();
return 0;
}
//---------------------------------------------------------------------------
int* (*Func1())()
{
printf("Func1()");
return Func2;
}
//---------------------------------------------------------------------------
int* (*Func1_1())()
{
printf("Func1_1()");
return Func2_1;
}
//---------------------------------------------------------------------------
int* (*Func1_2())()
{
printf("Func1_2()");
return Func2;
}
//---------------------------------------------------------------------------
int* (*Func1_3())()
{
printf("Func1_3()");
return Func2_2;
}
//---------------------------------------------------------------------------
int* Func2()
{
static num=0;
num++;
printf("\tFunc2() %i",num);
return #
}
//---------------------------------------------------------------------------
int* Func2_1()
{
static num=1000;
num--;
printf("\tFunc2_1() %i",num);
return #
}
//---------------------------------------------------------------------------
int* Func2_2()
{
static num=2222;
num--;
printf("\tFunc2_2() %i",num);
return #
}
//---------------------------------------------------------------------------
|