C에서 배열은 다음과 같은 고유한 소멸 규칙을 나타냅니다. 차원과 포인터의 존재 여부에 따라 다릅니다. 이 현상은 1차원 배열(int[])과 2차원 배열(int[][])의 소멸 시 동작을 비교할 때 관찰할 수 있습니다.
1차원 배열 : int*[]는 int로 붕괴됩니다
int[]와 같은 1차원 배열이 붕괴되기 쉬운 경우 첫 번째 요소에 대한 포인터처럼 동작합니다. 이는 다음 코드에서 분명하게 드러납니다.
<code class="cpp">std::is_same<int*, std::decay<int[]>::type>::value; // true</code>
이 코드는 int[]의 붕괴가 정수에 대한 포인터처럼 동작함을 나타내는 int*를 생성하기 때문에 true를 반환합니다.
2차원 배열: int[][1]은 int로 붕괴되지 않습니다
1차원 배열과 달리 2차원 배열(int[][])은 int로 붕괴되지 않습니다. 포인터에 대한 포인터(int**). 대신 배열 특성을 유지합니다. 이는 다음 코드에서 설명됩니다.
<code class="cpp">std::is_same<int**, std::decay<int[][1]>::type>::value; // false</code>
이 코드는 false로 평가되어 int[][1]의 붕괴가 int**를 생성하지 않음을 나타냅니다.
배열 붕괴에서 포인터의 역할
이 두 경우의 주요 차이점은 포인터의 개입에 있습니다. int[]와 같은 포인터 유형으로 1차원 배열을 선언하면 배열에 대한 포인터가 됩니다. 이는 포인터에 대한 포인터인 int*로 붕괴되는 이유를 설명합니다.
<code class="cpp">std::is_same<int**, std::decay<int*[]>::type>::value; // true</code>
추론: int가 아닌 이유[][]?
2차원 배열이 포인터 대 포인터로 붕괴되지 않는 이유는 포인터 연산을 수행하는 데 어려움이 따르기 때문입니다. 2차원 배열에서 각 요소는 인접한 메모리 블록 내의 특정 오프셋에 저장됩니다. 요소에 액세스하려면 컴파일러는 두 차원의 크기를 모두 알아야 합니다. int**로 분해되면 중요한 정보가 손실되고 포인터 연산이 불가능해집니다.
위 내용은 `int[]`가 `int*`로 변하지만 `int[][]`로 변하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!