이 예를 살펴 :정수 배열에 대한 포인터가 C에서 어떻게 작동합니까?
#include <stdio.h>
#include <stdlib.h>
int main() {
int a[5] = {1,2,3,4,5}; // LINE A
int (*b)[5] = &a; // LINE B
printf("%d\n", (*b)[0]); // LINE C
}
나는
LINE B
에int (*b)[5] = a
를 작성 시도했지만 작동하지 않았다. 아무도 왜 이것이 작동하지 않는지 설명 할 수 있습니까? 배열은 포인터로 붕괴되었지만, 왜 내가 명시 적으로a
주소를 가져 가야하는지 이해할 수 없다.&a
. 그것은 부패 되었기 때문에a
은 이미 포인터입니다. 그러나 이제는 포인터의 주소를 취합니까? 더블 포인터? 응?아무도 어떻게
(*b)[0]
이 작동하는지 설명 할 수 있습니까? 그것은 그 자체가 5 int의 배열에 대한 포인터 인b
을 역 참조하는 것과 같습니다. 그러나 어떻게 든 그것의 원소를 취합니다. 이 경우 [0] 번째 요소가 5 개의 정수가 아닌가? 나는 어떻게 든 하나의 정수로 끝나고1
을 출력한다.
저는 정말 혼란 스럽습니다. 감사.
1) 배열은 자체 요소에 대한 포인터가 아니라 첫 번째 요소에 대한 포인터로 감소합니다.2) "5 ints의 배열에 대한 포인터"를 역 참조하는 경우, "5 개의 정수 배열"을 얻습니다. 그러면 '[0]'으로 색인화됩니다. –
배열은'sizeof','_Alignof' (C11),'&'(귀하의 경우에 적용됨) 또는 배열 초기화 프로그램에서 사용 된 문자열 리터럴의 피연산자가 아닌 경우에만 감소합니다. – mafso
@mafso 이것은 '_Alignof'에'_Alignof'에 적용되지 않습니다. 피연산자는 유형 이름이며 표현식이 될 수 없습니다. c11의 초안 버전은 버그가 있으며 c11의 릴리스 버전에서 수정되었습니다. – ouah