>  기사  >  백엔드 개발  >  C에서 int[]와 int[][]의 배열 붕괴가 다른 이유는 무엇입니까?

C에서 int[]와 int[][]의 배열 붕괴가 다른 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-10-26 04:15:02571검색

 Why Does Array Decay Differ for int[] and int[][] in C  ?

배열에 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.