静态二维阵列和动态二维阵列的存储器映射之间的区别?

mig*_*WOZ 3 c++ arrays multidimensional-array dynamic-arrays

从我的理解当我们使用像这样的指针创建数组

    int **ptr = new int*[2];

    for(int i=0;i<2;i++)
     {
       ptr[i] = new int[3];
     }
Run Code Online (Sandbox Code Playgroud)

看起来像这样 在此输入图像描述

但是当我们创建这样的静态数组时

 int arr[2][3]={1,2,3,4,5,6);
Run Code Online (Sandbox Code Playgroud)

现在如果我们运行以下代码

cout<<"Address of arr = "<<&arr;
cout<<"arr is pointing to = "<<*arr;
Run Code Online (Sandbox Code Playgroud)

它显示了相同的地址,这意味着arr是指向自身的指针,这看起来很混乱,因为如果数组是双指针,那么它如何指向自身.

很明显,编译器正在做一些奇怪的事情.你能解释一下这是如何工作的吗?

Ben*_*ley 6

它显示相同的地址,这意味着arr是指向自身的指针

不,这并不意味着.这意味着地址与地址arr相同arr[0][0].这是完全合理的,因为它arr[0][0]是其中的一部分arr,并且实际上是它的一开始.同样地,你会发现我的左臂与你找到我的位置完全相同.

&arr和之间的区别*arr是类型.&arr是类型int (*)[2][3](指向2个3个整数数组的数组的指针),而是*arr类型int[3](3个整数的数组).您的cout陈述不表达这种差异,仅仅是因为operator<<没有定义来表达它.