다음을 통해 공유


더 복잡 한 선언 자 해석

괄호 안에 지정 "복잡 한 자가"의 특정 해석을 하는 선언 자를 포함할 수 있습니다. 복잡 한 선언 자를 여러 배열, 포인터 또는 한정자를 함수에서 정규화 된 식별자입니다.배열, 포인터, 함수 한정자의 다양 한 조합을 단일 식별자에 적용할 수 있습니다.일반적으로 typedef 선언을 간단 하 게 하는 데 사용할 수 있습니다.참조 하십시오 형식 정의 선언을.

복잡 한 선언 자 해석 하에 괄호 및 괄호 (오른쪽 식별자의 한정자) 별표 (왼쪽 식별자의 한정자) 우선 합니다.괄호 및 괄호 안에 동일한 우선 순위와 왼쪽에서 오른쪽으로 연결 합니다.선언 자를 완벽 하 게 해석 한 후에 형식 지정 자가 마지막으로 적용 됩니다.괄호를 사용 하 여 연결 하는 기본 순서를 무시 하 고 특정 해석을 강제로 수 있습니다.그러나 괄호,는 식별자 이름 자체를 사용 하지 마십시오.이 매개 변수 목록은 잘못 해석 될 수 있습니다.

복잡 한 선언 자 해석 하는 방법은 다음 네 단계를 사용 하 여 "내부,"에서 읽을 수 있습니다.

  1. 식별자로 시작 하 고 오른쪽 괄호 또는 괄호 (있는 경우)을 직접 찾습니다.

  2. 이러한 대괄호 또는 괄호를 해석 한 다음 왼쪽에 별표를 표시 합니다.

  3. 오른쪽 괄호가 어떤 단계에서 발생 하는 경우 이전 단계로 이동 하 여 규칙 1과 2는 괄호 안의 적용 합니다.

  4. 형식 지정자를 적용 합니다.

    char *( *(*var)() )[10];
     ^   ^  ^ ^ ^   ^    ^
     7   6  4 2 1   3    5
    

이 예에서는 단계에 순서 대로 번호가 지정 됩니다 및 다음과 같이 해석할 수 있습니다.

  1. 식별자 var 로 선언

  2. 에 대 한 포인터

  3. 반환 하는 함수

  4. 에 대 한 포인터

  5. 되는 10 요소의 배열

  6. 에 대 한 포인터

  7. 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 복잡 한 선언이 발생 하지 않도록 하려면를 참조 하십시오 형식 정의 선언을.

참고 항목

개념

선언 및 형식