2014-09-16 1 views
1

일부 포인터 선언을 해석하는 데 문제가 있습니다. 잘만되면 누군가 나를 도울 수 있습니다. 이것은 c99 구문입니다. 나는 그것이 중복 될 수 있지만약간 복잡한 포인터 선언을 intrepret하는 방법

typedef struct stuff thing; 
    struct stuff{ 
     int a; 
     char *(*b)[][2]; 
     int c; 
     thing *(*d)[]; 
    } 

같은 것을 어떻게 같이 B와 D를 해석 할 경우? 또한 char * (* b) [] [2] ** b [] [2]와 동일합니까? 그 이유는 무엇?

감사합니다.

+6

체크 아웃 cdecl.org - 예를 들어, 여기에 ['b' (http://cdecl.ridiculousfish.com/?q=+char+*%28*b입니다 % 29 % 5B % 5D % 5B2 % 5D % 3B). –

+0

나는 또한이 기사가 "Right-Left Rule"에 대해 좋아한다. http://ieng9.ucsd.edu/~cs30x/rt_lt.rule.html – turbulencetoo

답변

0

C 선언문은 항상 안쪽에서 읽습니다. 그 외에도 연산자 우선 순위를 알아야합니다. 즉, 배열 인덱스 연산자가 역 참조 연산자보다 우선합니다. d 포인터 배열 ((*d)[]) (*(*d)[])thing 행 (thing *(*d)[];) 및 포인터하지 포인터 포인터 (*d)는 thing의 배열하는 것이기 때문이다.

앞서 보았 듯이 *a[](*a)[]이 같지 않은 이유가 우선 순위이므로 첫 번째는 포인터 배열이고 두 번째는 배열 포인터입니다.

그래서 가장 중요한 링크는 위키 피 디아에서 operator precedence table입니다.

0

char *(*b)[][2];char 포인터 배열의 배열에 대한 포인터로 b을 선언한다. 그러한 표현을 해석하는 것을 기억하십시오; 다음 표에 따라 우선 순위를 고려하여 포인터 선언에 우선 순위를 할당하고 연관 : 당신은 here에서 몇 가지 예를 볼 수 있습니다

enter image description here

.

char *(*b)[][2]char **b[][2]과 동일합니까? 그 이유는 무엇?

char **b[][2]char 포인터 두 포인터 배열의 어레이로서 b 선언. 이유는 위 표를 참조하십시오.

0

외부로의 선언 선언은 연관성에 따라 다릅니다.

char *(*b)[][2]; 

가 의미하는 말 : b라는 이름의 변수입니다.

하지만 그것이 무엇입니까? 오, 포인터 때문에 *b입니다.

그럼? 먼저 대괄호로 연결하십시오. 따라서 (*b)[][2]은 1 차원에서 길이가 2 인 2 차원 배열을 가리키는 포인터임을 의미합니다.

하지만 배열의 유형은 무엇입니까? char *은이를 나타냅니다.

따라서 전체 선언은 b가 1 차원에서 길이가 2 인차원의 배열을 가리키는 포인터임을 의미합니다.

char **b[][2]; 

이 일을 다음으로 변경하는 방법이라면?

b 먼저 [][2]으로 진행하고, 그래서이 b[][2]b는 1 차원 길이를 2 차원 배열을 나타내는 변수이다 나타내고있다.

다음에 char **을 추가하면, b은 2D char ** 배열이며 1 차원에서 길이가 2입니다.

C에서 타이핑 시스템을 사용하면 많은 놀라운 결과를 얻을 수 있습니다. 유형 나무에 대해 더 자세히 알아보십시오.

일을 분명히함으로써 두 번째 해석이 훨씬 간단하다고 생각합니다.

+0

@mafso 나는 1 차원이라고 생각 하는가? ... 3rd 2nd 1st. 오른쪽에서 왼쪽으로. – HuStmpHrrr

+0

차원을 계산할 위치가 명확하지 않다는 것을 알지 못했습니다. 나는 이것에 대한 어떤 협약이라도 존재한다면, "가장 바깥 쪽"에서 "가장 깊은"까지 셀 수있는 것이 정상이라고 느꼈다. 그것에 대해 생각하면 계산 방법이 아마도 더 좋습니다. – mafso

0

대화 형 사이트 C gibberish ↔ English은 매우 유용합니다.

char *(*b)[][2]; // declare b as pointer to array of array 2 of pointer to char 

(*b)


를 숯불 포인터의 어레이 (2)의 배열에 대한 포인터 TBD

char *(*b)[][2]의 어레이 (2)의 배열에 대한 포인터

(*b)[][2]를 TBD에 대한 포인터이다


char **b[][2]; // declare b as array of array 2 of pointer to pointer to char 

b가 TBD

b[][2] 인 것이 TBD

char **b[][2]의 어레이 (2)의 배열은 포인터의 어레이 (2)의 배열


없음 동일한는 char 포인터이다. ()이 어떻게 해석 순서에 영향을 미치는지 확인하십시오. 필드 d를 들어

:

thing *(*d)[]; // declare d as pointer to array of pointer to thing 
       // or declare d as pointer to array of pointer to struct stuff 
관련 문제