더 복잡 한 선언 자 해석
괄호 안에 지정 "복잡 한 자가"의 특정 해석을 하는 선언 자를 포함할 수 있습니다. 복잡 한 선언 자를 여러 배열, 포인터 또는 한정자를 함수에서 정규화 된 식별자입니다.배열, 포인터, 함수 한정자의 다양 한 조합을 단일 식별자에 적용할 수 있습니다.일반적으로 typedef 선언을 간단 하 게 하는 데 사용할 수 있습니다.참조 하십시오 형식 정의 선언을.
복잡 한 선언 자 해석 하에 괄호 및 괄호 (오른쪽 식별자의 한정자) 별표 (왼쪽 식별자의 한정자) 우선 합니다.괄호 및 괄호 안에 동일한 우선 순위와 왼쪽에서 오른쪽으로 연결 합니다.선언 자를 완벽 하 게 해석 한 후에 형식 지정 자가 마지막으로 적용 됩니다.괄호를 사용 하 여 연결 하는 기본 순서를 무시 하 고 특정 해석을 강제로 수 있습니다.그러나 괄호,는 식별자 이름 자체를 사용 하지 마십시오.이 매개 변수 목록은 잘못 해석 될 수 있습니다.
복잡 한 선언 자 해석 하는 방법은 다음 네 단계를 사용 하 여 "내부,"에서 읽을 수 있습니다.
식별자로 시작 하 고 오른쪽 괄호 또는 괄호 (있는 경우)을 직접 찾습니다.
이러한 대괄호 또는 괄호를 해석 한 다음 왼쪽에 별표를 표시 합니다.
오른쪽 괄호가 어떤 단계에서 발생 하는 경우 이전 단계로 이동 하 여 규칙 1과 2는 괄호 안의 적용 합니다.
형식 지정자를 적용 합니다.
char *( *(*var)() )[10]; ^ ^ ^ ^ ^ ^ ^ 7 6 4 2 1 3 5
이 예에서는 단계에 순서 대로 번호가 지정 됩니다 및 다음과 같이 해석할 수 있습니다.
식별자 var 로 선언
에 대 한 포인터
반환 하는 함수
에 대 한 포인터
되는 10 요소의 배열
에 대 한 포인터
char값입니다.
예제
다음 예제에서는 다른 복잡 한 선언에 설명 및 괄호 선언의 의미에 미치는 영향을 표시 합니다.
int *var[5]; /* Array of pointers to int values */
배열 한정자 포인터 한정자를 보다 높은 우선 순위 지금 있는 var 배열을 선언 합니다.포인터가 한정자 배열 요소 형식에 적용 됩니다. 따라서 배열 요소에 대 한 포인터는 int 값입니다.
int (*var)[5]; /* Pointer to array of int values */
이 선언에서 var, 괄호는 포인터 한정자를 보다 높은 우선 순위는 배열 한정자를 제공 하 고 var 5 배열에 대 한 포인터 선언 int 값입니다.
long *var( long, long ); /* Function returning pointer to long */
함수 한정자도 포인터 한정자를 보다 높은 우선 순위 때문이 선언에 대 한 var 선언 var 에 대 한 포인터를 반환 하는 함수는 긴 값입니다.함수 두 개를 사용 하도록 선언 된 긴 인수 값입니다.
long (*var)( long, long ); /* Pointer to function returning long */
이 예제에서는 이전 하는 것과 유사합니다.괄호는 포인터 한정자를 보다 높은 우선 순위 함수 한정자를 지정 하 고 var 에 대 한 포인터를 반환 하는 함수에 선언 된는 긴 값입니다.함수를 두 개 사용 다시 긴 인수.
struct both /* Array of pointers to functions */
{ /* returning structures */
int a;
char b;
} ( *var[5] )( struct both, struct both );
함수는 배열 요소의 수 없습니다 있지만이 선언 대신 함수 포인터의 배열을 선언 하는 방법을 보여 줍니다.이 예제에서 var 5 가지 구조체와 두 명의 구성원을 반환 하는 함수를 가리키는 포인터의 배열 선언입니다.인수는 함수에 두 구조체와 동일한 구조체 형식으로 선언 both.주위의 괄호 참고 *var[5] 필요 합니다.없이 선언 함수, 배열을 선언 하려고 아래와 같이 됩니다.
/* ILLEGAL */
struct both *var[5]( struct both, struct both );
다음 문은 포인터 배열을 선언 합니다.
unsigned int *(* const *name[5][10] ) ( void );
name 가 50 요소는 다차원 배열로 구성 된 배열입니다.요소는 상수에 대 한 포인터에 대 한 포인터입니다.이 상수 포인터 매개 변수가 없는 한 부호 없는 형식에 대 한 포인터를 반환 하는 함수를 가리킵니다.
이 다음은 세 개를 배열에 대 한 포인터를 반환 하는 함수는 이중 값입니다.
double ( *var( double (*)[3] ) )[3];
이 선언에서 함수에 대 한 포인터 배열을 반환, 이후 함수 반환 배열을 사용할 수 없습니다.여기 var 세 개를 배열에 대 한 포인터를 반환 하는 함수에 선언 된 이중 값입니다.함수가 var 하나의 인수를 사용 합니다.반환 값과 같은 인수를 배열에 세에 대 한 포인터입니다 이중 값입니다.인수 유형으로 복잡 한 부여 됩니다 추상 선언 자.인수 형식에 대 한 별표를 묶은 괄호는 필수입니다. 없이 인수 유형 세를 가리키는 포인터의 배열 수 있습니다 이중 값입니다.토론 및 추상 선언 자의 예제를 참조 하십시오. 추상 선언 자.
union sign /* Array of arrays of pointers */
{ /* to pointers to unions */
int x;
unsigned y;
} **var[5][5];
위의 예제와 같이 포인터는 다른 포인터를 가리킬 수 있습니다와 배열을 요소로 포함할 수 있습니다.여기 var 5 가지 요소 배열입니다.각 요소는 공용 구조체와 두 명의 구성원에 대 한 포인터를 가리키는 포인터의 5 요소입니다.
union sign *(*var[5])[5]; /* Array of pointers to arrays
of pointers to unions */
괄호의 선언 의미를 변경 하는 방법 보여 주는이 예제입니다.이 예제에서 var 는 공용 구조체를 가리키는 포인터의 5 요소 배열 가리키는 포인터의 5 요소 배열입니다.예제를 사용 하는 방법에 대 한 typedef 복잡 한 선언이 발생 하지 않도록 하려면를 참조 하십시오 형식 정의 선언을.