>백엔드 개발 >C++ >`int[]`가 `int*`로 변하지만 `int[][]`로 변하지 않는 이유는 무엇입니까?

`int[]`가 `int*`로 변하지만 `int[][]`로 변하지 않는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-10-28 15:38:02682검색

Why does `int[]` decay into `int*` but not `int[][]`?

int가 왜[] int로 소멸*되지만 int[][]가 아닌 이유

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

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