2013-04-01 3 views
2

차 (*)]

char *array[10];

char (*array)[10]; 차이는 무엇입니까? 나의 이해함으로써

,

  • 사례 1 :
    • array[]*보다 높은 우선 순위를 가지고 있기 때문입니다 크기 10
    • 의 문자 배열의 배열로 선언된다.
  • 케이스 2 :
    • array 크기 10
    • 문자 배열에 대한 포인터로 선언이다 동일한 우선 순위를 가지며 이들은 좌측까지 평가 () 때문에 [] -권리. 그런 다음 * 연산자가 평가됩니다.

내 이해가 맞습니까? 그것이 맞다하더라도, 나는 엄청난 혼란을 겪습니다. 누군가가 그 차이점을 조금 더 명확하게 설명해 주시겠습니까?

+0

질문. 첫 번째는 문자 배열 배열이 아닙니다. 이것은 단순히 char to pointer 배열입니다. 두 번째로 ['()'와'[]'] (http://en.cppreference.com/w/c/language/operator_precedence)는 연산자와 우선 순위가 같지만 그 이상입니다. . 이들은 선언문입니다. 괄호는'[] '로부터'array'를 분리하고'*'와 결합 시키는데 사용됩니다. 네가 이해심에 가깝다고 들리는 군. – WhozCraig

+0

@WhozCraig, 그 설명 주셔서 감사합니다 :) –

답변

7

C의 유형을 해석 할 때 [...] (또는 [...] [...] ...) 그룹을 전환 한 다음 왼쪽에서 오른쪽으로 읽습니다. 따라서

char *array[10] -> char *[10]array = 

그리고

char (*array)[10] -> char [10](*array) 

를 "array 차르 10 포인터 배열은"는 너무

"array 10 개 문자의 배열에의 포인터는" 첫 번째 경우 인 array은 10 개의 연속 포인터이며 각 포인터는 char (단일 문자 또는 문자열과 같은 char 시퀀스 일 수 있음), whe 두 번째 경우에 array은 10 개의 인접한 문자 배열에 대한 단일 포인터입니다.

함수 유형과 비슷한 기능을 수행 할 수 있습니다. 매개 변수 목록을 왼쪽으로 바꾸면됩니다. 예를 들어,

char* (*f[10])(int*) -> char* (int*)(*[10]f) 

는 "f 인수를 int로 포인터를 가지고 숯불에 대한 포인터를 리턴하는 함수에 대한 포인터 (10)의 배열이다."

+0

와우. 이것은 확실히 혼란의 안개를 제거합니다! 이런 종류의 해석이 _all_ C 선언문에 적용됩니까? –

+0

@AnishRam 아니요,'int a [3] [5]'당신은'[3] [5]'을 깨뜨리지 않고 여러분은 전체를 하나로 묶습니다. –

+0

@AnishRam 거의 (나는 Alexey의 nit를 다룰 편집을 추가했다). 함수 선언으로 확장 할 수 있습니다 ... 배열 지정자를 이동하는 것과 같은 방식으로 괄호로 묶인 인수 목록을 왼쪽으로 이동하십시오. –

1

첫 번째 경우 arrayvoid some_function(char* array[10])과 같은 함수 매개 변수가 아닌 경우 char에 대한 10 개의 포인터 배열입니다. 함수 매개 변수이면 char에 대한 포인터를 가리키는 포인터입니다.

두 번째 경우에는 유효하지 않은 선언이 있습니다. 컴파일 오류 here을 참조하십시오.

두 번째 경우 array은 10 개의 문자 배열에 대한 포인터입니다.

+0

두 번째 경우는 오타였습니다! 나는 지금 포스트를 편집했다. 죄송합니다! 또한 첫 번째 경우에,'array'가 10 개의 포인터의 배열이라고 말할 때, 나는 이해할 수 있을지 모르겠다. 이것은'*'가'[]'보다 먼저 평가된다는 것을 의미합니까? –

+0

식에서'* array [0]'을 사용했다면'array [0]'은 먼저'* (array + 0)'으로 평가하고'*' 배열 + 0))'. –

+0

나는 그것을 알고 있었다. 나는 그 선언들과 아주 혼란스러워진다. 그래도 도와 ​​줘서 고마워! –

1

char * array [10];은 10 개의 char 포인터의 배열입니다.

예 :

char *array[10] = {"Hello", "Hai"}; 

같은 문자 (* 어레이) [10];은 10 자의 배열에 대한 포인터입니다.

두 번째 점은 문자 arr [10]을 가리킬 수 있습니다.


배열 = &arr;

C pointer to array/array of pointers disambiguation

+0

'10 바이트의 문자 배열 '- 그게 뭐야? –

+0

내 편집을 의뢰하십시오. – Jeyaram

+0

'바이트'가 불필요하다고 생각하지 않습니까? 이미'char'가 있습니다. –

3

는 첫번째 아마도 더 문자 포인터 배열로 불린다.

복잡한 포인터 정의 읽기는 일종의 트릭을 인식하면 더 쉽게 할 수 있습니다. 나는 톤을 도왔던 this article를 읽었다. 멋지게 보이는 another one도 있습니다.

+0

그레이트 링크! 감사! '밖으로 그들을 확인합니다. –

+0

물론, 문제 없습니다. 일단 패턴을 배운다면 복잡한 선언을 읽는 것이 매우 간단 해집니다. –

0

체크 이제 K & R 깊은 C 비밀 또는 "복잡한 선언"에서 "스크램블링 C 선언"섹션 ...