静态二维数组和动态二维数组的内存映射之间的区别?
Difference between memory map of static 2-d array and dynamic 2-d array?
根据我的理解,当我们使用这样的指针创建数组时
int **ptr = new int*[2];
for(int i=0;i<2;i++)
{
ptr[i] = new int[3];
}
看起来像这样
但是当我们像这样创建一个静态数组时
int arr[2][3]={1,2,3,4,5,6);
现在如果我们运行下面的代码
cout<<"Address of arr = "<<&arr;
cout<<"arr is pointing to = "<<*arr;
它显示相同的地址,这意味着 arr 是指向自身的指针,这看起来很混乱,因为如果数组是双指针那么它怎么能指向自己。
很明显,编译器在幕后做了一些奇怪的事情。你能解释一下这是如何工作的吗?
it shows the same address, which means arr is pointer which is
pointing to itself
不,不是那个意思。意思是arr
的地址和arr[0][0]
的地址一样。这是完全有道理的,因为 arr[0][0]
是 arr
的一部分,而且实际上是在它的开头。同样,你会发现我的左臂与你会发现我的位置完全相同。
&arr
和*arr
的区别在于类型。 &arr
是 int (*)[2][3]
类型(指向 2 个 3 整数数组的数组),而 *arr
是 int[3]
类型(3 整数数组)。您的 cout
语句没有表达这种差异,仅仅是因为未定义 operator<<
来表达它。
根据我的理解,当我们使用这样的指针创建数组时
int **ptr = new int*[2];
for(int i=0;i<2;i++)
{
ptr[i] = new int[3];
}
看起来像这样
但是当我们像这样创建一个静态数组时
int arr[2][3]={1,2,3,4,5,6);
现在如果我们运行下面的代码
cout<<"Address of arr = "<<&arr;
cout<<"arr is pointing to = "<<*arr;
它显示相同的地址,这意味着 arr 是指向自身的指针,这看起来很混乱,因为如果数组是双指针那么它怎么能指向自己。
很明显,编译器在幕后做了一些奇怪的事情。你能解释一下这是如何工作的吗?
it shows the same address, which means arr is pointer which is pointing to itself
不,不是那个意思。意思是arr
的地址和arr[0][0]
的地址一样。这是完全有道理的,因为 arr[0][0]
是 arr
的一部分,而且实际上是在它的开头。同样,你会发现我的左臂与你会发现我的位置完全相同。
&arr
和*arr
的区别在于类型。 &arr
是 int (*)[2][3]
类型(指向 2 个 3 整数数组的数组),而 *arr
是 int[3]
类型(3 整数数组)。您的 cout
语句没有表达这种差异,仅仅是因为未定义 operator<<
来表达它。