배열에 Decay 입력: int* 대 int[][]
C에서 배열은 특정 상황에서 포인터로 붕괴됩니다. 함수에 전달하거나 포인터에 할당할 때와 같습니다. 그러나 이러한 붕괴 동작은 배열의 차원에 따라 달라질 수 있습니다.
다음 코드를 고려하세요.
<code class="cpp">std::is_same<int*, std::decay<int[]>::type>::value; // true std::is_same<int**, std::decay<int[][1]>::type>::value; // false</code>
첫 번째 줄은 성공적으로 컴파일되어 int[] 배열이 다음으로 붕괴되는 것을 확인합니다. int 포인터. 그러나 두 번째 줄은 실패합니다. 이는 int[][1] 2차원 배열이 int* 포인터로 붕괴되지 않음을 나타냅니다.
이러한 불일치의 이유는 포인터 연산의 특성에 있습니다. . int[]와 같은 1차원 배열에서는 각 요소가 메모리에 연속적으로 저장됩니다. 이를 통해 배열에 대한 포인터가 증가하거나 감소하여 인접한 요소에 액세스할 수 있습니다. 그러나 int[][1]과 같은 2차원 배열에서는 각 요소가 int의 하위 배열에 대한 포인터로 저장됩니다. int**가 이 2차원 배열을 가리키는 경우 각 하위 배열의 크기를 알 수 없기 때문에 의미 있는 포인터 연산을 수행할 수 없습니다.
대신, 차원 간의 관계를 유지하려면 배열이 붕괴되면 C는 2차원 배열을 포인터 배열에 대한 포인터로 붕괴시킵니다. 즉, int[][1]은 int (*[])[1]로 붕괴됩니다.
이 동작은 포인터와 비포인터가 있는 혼합 배열을 포함하여 모든 차원의 배열에 적용됩니다. 예를 들어 int[]는 int로 붕괴되지만 int[][]는 아니지만 int[]는 int로 붕괴됩니다.
C에서 배열을 사용하여 작업할 때 배열 유형과 포인터 유형 간의 호환성을 보장하려면 이러한 유형 붕괴 메커니즘을 이해하는 것이 중요합니다.
위 내용은 C에서 int[]와 int[][]의 배열 붕괴가 다른 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!