다차원 배열의 유형 붕괴
C에서 배열은 특정 상황에서 포인터로 유형 붕괴를 겪습니다. 그러나 1차원 배열과 다차원 배열의 동작은 다릅니다. 왜 그럴까요?
1차원 배열
다음 코드를 고려하세요.
<code class="cpp">int[] arr = {1, 2, 3};</code>
유형 붕괴는 int[]를 int로 변환합니다. *, 다음과 같이 작성할 수 있습니다.
<code class="cpp">std::is_same<int*, std::decay<int[]>::type>::value; // true</code>
int[]가 사실상 배열의 첫 번째 요소에 대한 포인터로 붕괴되기 때문입니다.
다차원 배열
그러나 이 동작은 다차원 배열로 확장되지 않습니다. 고려 사항:
<code class="cpp">int[][1] arr2 = {{1}, {2}, {3}};</code>
유형 붕괴는 int[][1]를 int**로 변환하지 않습니다. 대신 크기 1의 배열에 대한 포인터인 int[][1]로 유지됩니다. 이는 다차원 배열에서 포인터 연산을 수행하는 것이 비연속적인 메모리 레이아웃으로 인해 비실용적이기 때문입니다.
배열에 대한 포인터
다차원 배열에 대해 원하는 포인터 유형을 얻으려면 배열에 대한 포인터를 만들어야 합니다. 고려 사항:
<code class="cpp">int*[] arr3 = {arr, arr2};</code>
다음으로 붕괴됩니다.
<code class="cpp">int**</code>
첫 번째 차원은 포인터이고 두 번째 차원은 int*[]가 int**로 붕괴되기 때문입니다. array.
의미
다차원 배열을 함수 인수로 전달하려면 이 동작을 이해하는 것이 중요합니다. 포인터에 대한 포인터를 기대하는 함수는 다차원 배열 자체를 허용할 수 없지만 배열에 대한 포인터를 허용할 수 있으며 이는 매개변수 전달 중에 포인터에 대한 포인터로 붕괴됩니다. 이러한 미묘한 차이는 포인터 연산의 일관성을 보장하고 메모리 액세스 오류를 방지합니다.
위 내용은 C에서 1차원 배열과 다차원 배열의 유형 붕괴가 다른 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!