二维数组如何存储在内存中?

Shu*_*am 2 c++ arrays pointers multidimensional-array c++11

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a[101][101];
    a[2][0]=10;
    cout<<a+2<<endl;
    cout<<*(a+2)<<endl;
    cout<<*(*(a+2));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么a + 2和*(a + 2)的值相同?提前致谢!

Ser*_*sta 7

a是一个2D数组,表示一个数组数组.但是当它在适当的上下文中使用时,它会衰减到指向数组的指针.所以:

  • in a+2,a衰减到指向大小为101的int数组的指针.当你传递给ostream时,你得到这个数组的第一个元素的地址,即&(a[2][0])
  • *(a+2)由定义 a[2]的:它是尺寸101的阵列开始于a[2][0].它衰减到指向int的指针,当你将它传递给ostream时,你得到它的第一个元素的地址,它仍然是&(a[2][0])
  • **(a+2)定义 a[2][0].当你将它传递给ostream时,你得到它的int值,这里是10.

但要注意:a + 2并且a[2]都是指向同一地址的指针(与之static_cast<void *>(a+2)相同static_cast<void *>(a[2])),但它们是指向不同类型的指针:首先指向大小为101的int数组,后者指向int.