书上说二维数组在内存中实际是以一维数组的形式连续存放的,我做了个小测试结果却令我无法理解。
#include <iostream>
using namespace std;
int main() {
int a[2][2] = {{0,1},{2,3}};
cout << &a << endl;
cout << a << endl;
cout << *a << endl;
cout << a[0] << endl;
cout << **a << endl;
cout << *(a[0]) << endl;
return 0;
}
输出:
0x7fff396c0210
0x7fff396c0210
0x7fff396c0210
0x7fff396c0210
0
0
那个内存地址处保存的是自己的地址?那么两次解引用不应该还是这个地址才对吗?怎么会变成0???
黄舟2017-04-17 15:39:18
이것을 이해해야 합니다. C에는 1차원 배열만 있지만 배열 요소는 배열 자체를 포함하여 모든 유형이 될 수 있으므로 2차원 배열이 있습니다. 이 경우 배열 이름(이 경우 배열 이름은 배열의 첫 번째 요소에 대한 포인터)을 역참조하면 배열의 첫 번째 요소가 생성되고 2차원 배열의 첫 번째 요소는 1차원 배열이 됩니다. 이므로 역참조는 이 1차원 배열의 첫 번째 요소입니다. 아래의 *(a[0]) 과 동일합니다.
귀하가 언급한 질문과 관련하여 배열 a의 이름은 배열 a의 내용에 대한 포인터이고 그 값은 첫 번째 요소의 주소와 동일합니다. 2차원 배열의 경우 a 세 값, a[0]의 주소, a0의 주소는 동일하지만, a와 a[0]의 주소는 약간 다릅니다. 같은 의미이며 보조 포인터이지만 a0의 주소는 첫 번째 수준 포인터입니다
PHPz2017-04-17 15:39:18
중단점 디버깅에서 다음 콘텐츠를 모니터링합니다.
a
&a
a 0
a[0]
&a[0]
위 문제에 대해 먼저 세 가지를 알아야 합니다.
(1) 2차원 배열은 1차원 배열입니다.
주소가 순차적으로 출력되고 모두 있다는 좋은 증거입니다. 계속해서.
(2) 어레이 주소는 무엇입니까?
1차원 배열로 시작하세요int b[2]
. 배열 주소는 배열 이름의 주소입니다. 예를 들어 &b는 배열 주소입니다.
2차원 int a[2][2]
, a는 2차원 배열 이름, &a는 2차원 배열 주소입니다. a[0]은 첫 번째 줄의 배열 이름(첫 번째 줄이라고 부르겠습니다), &a [0]은 첫 번째 행 배열의 배열 주소입니다. 마찬가지로 a[1]과 &a[1]은 각각 두 번째 행의 배열 이름과 배열 주소입니다.
(3) 배열 이름은 포인터로 변환될 수 있습니다
우선 한 가지만 수정하세요int b[2]
. 마찬가지로 int a[2][2]
내부의 a도 포인터가 아닙니다. a와 b가 포인터로 변환될 수 있다고 해서 변환이 가능하다는 의미는 아닙니다. 누가 int가 짧다고 말했습니까?
좋아요, 코드가 왜 이런지 이해하려면 유형을 직접 모니터링하는 것이 가장 좋은 방법입니다.
a[0] 및 b 유형에 주의하세요.