>백엔드 개발 >C++ >C에서 1차원 배열과 다차원 배열의 유형 붕괴가 다른 이유는 무엇입니까?

C에서 1차원 배열과 다차원 배열의 유형 붕괴가 다른 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-10-26 11:48:29294검색

Why Does Type Decay Differ for One-Dimensional and Multidimensional Arrays in C  ?

다차원 배열의 유형 붕괴

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

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