静态2维数组和动态2维数组的内存映射有什么区别?

3

据我了解,当我们使用指针创建数组时:

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

    for(int i=0;i<2;i++)
     {
       ptr[i] = new int[3];
     }

它看起来像这样: enter image description here 但是当我们创建一个静态数组时,它会变成这样:
 int arr[2][3]={1,2,3,4,5,6);

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

cout<<"Address of arr = "<<&arr;
cout<<"arr is pointing to = "<<*arr;

代码展示了同一个地址,这意味着arr是一个指向它自身的指针,这看起来非常令人困惑,因为如果数组是双重指针,那么它怎么能指向它自己。

很明显编译器在幕后做了一些奇怪的事情。 请问您能否解释一下这是如何工作的。


1
arr 不是指针。arr 是一个数组。数组不是指针。指针不是数组。自由就是奴隶。 - Kerrek SB
他是正确的(尽管数组通常会隐式转换为数组,指针具有[]运算符) - DarthRubik
1
@DarthRubik - 没有隐式转换这种东西。强制类型转换是你在源代码中编写的内容,用于告诉编译器进行转换。 - Pete Becker
你的代码是C++,不是C。两者是不同的编程语言。运算符重载和不同的语义可能会改变行为。 - too honest for this site
@DarthRubik 不仅指针有 [] 运算符,严格来说(至少在 C 中),数组是没有 [] 运算符的! - Steve Summit
显示剩余4条评论
1个回答

6
它展示了相同的地址,这意味着arr是指向自身的指针。不,它并不意味着那样。它的意思是arr的地址和arr[0][0]的地址是一样的。这是有道理的,因为arr[0][0]是arr的一部分,并且实际上就在它的开头。类似地,你可以在我左手臂正好与你找到我的位置相同。
&arr和*arr之间的区别在于类型。&arr的类型是int (*)[2][3] (指向2个包含3个int的数组的指针),而*arr的类型是int[3] (包含3个int的数组)。这种差异没有在您的cout语句中表达出来,因为operator<<没有定义来表示它。

这意味着它们具有相同的地址,但在内存中存在不同的物理实体。@KerrekSB - mightyWOZ
不,@Balraj。指针是指向其他东西的变量,因此您有指针的地址和指针指向的其他东西的地址。数组就是数组。它不指向任何东西。它是存储。只涉及一个地址:数组的地址。 - user4581301

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接