【问题标题】:Strange behaviour of arr[] in case when arr is a 2d array当 arr 是二维数组时 arr[] 的奇怪行为
【发布时间】:2023-01-11 02:36:23
【问题描述】:

我正在学习二维数组和它的指针表示。我运行了以下命令来获取二维数组的内部工作。我得到了 arr2d[0] 的奇怪结果

    int arr2d[2][3]{{1,2,3},{4,5,6}};
    cout<<"&arr2d[0][0] :"<<&arr2d[0][0]<<endl;
    cout<<"(&(arr2d[0])) :"<<(&(arr2d[0]))<<" arr2d[0] :"<<arr2d[0]<<endl;
    cout<<"*(arr2d[0]) :"<< *(arr2d[0])<<" *(&(arr2d[0])) :"<<*(&(arr2d[0]))<<endl;

输出:

&arr2d[0][0] :0x3e6d7ff6c0
(&(arr2d[0])) :0x44efbffbe0 arr2d[0] :0x44efbffbe0
*(arr2d[0]) :1 *(&(arr2d[0])) :0x44efbffbe0

如果 arr2d[0] 本身是“循环指向”,*(arr2d[0]) 如何将 1 作为输出? 同样显然,指针算法对于 arr[0] 不起作用,因为 arr[0]+1 没有得到一个到 arr[1]。

我没想到 arr[0] 会循环指向自身,我希望它指向长度为 3 的一维数组的指针。this 告诉我会发生这种情况,但我想知道为什么 arr[0] 怎么能指向对自身但同时 *(arr[0]) 给出 1?

【问题讨论】:

  • “指向自身”是什么意思?整个数组,第一行和第一个元素都有相同的地址
  • 细节很重要,您发布的代码的输出不是以12345开头
  • 旁注:很多人都知道数组是指向其第一个元素的指针。这不是真的。数组就是数组。它只是将decays 轻松自动地转换为指针。
  • 此代码无法生成此输出。请发布minimal reproducible example

标签: c++ arrays pointers


【解决方案1】:

如果arr2d[0] 本身“循环指向”,*(arr2d[0]) 如何将 1 作为输出?

它没有指向自己。数组不是指针,但像任何变量一样,它们有一个地址,数组的地址与第一个元素的地址相同。这扩展到多维数组,所以 arr2darr2d[0]arr2d[0][0] 都具有相同的地址,尽管它们的类型不同。

显然指针算法对 arr[0] 不起作用,因为 arr[0]+1 没有得到一个到 arr[1]

arr2d[0]衰减为&amp;arr2d[0][0],所以aarr2drr[0]+1&amp;arr2d[0][0]+1,与arr2d[0][1]相同。如果您使用表达式 arr2d + 1,它将与 &amp;arr2d[0] + 1 相同,后者为您提供 arr2d[1]

【讨论】:

  • nitpick “&arr2d、&arr2d[0] 和 &arr2d[0][0] 都具有相同的地址”这些已经是地址,它们具有“相同的值”
  • @463035818_is_not_a_number 不错。更新。
猜你喜欢
  • 2015-08-16
  • 2012-02-13
  • 1970-01-01
  • 2020-07-10
  • 2021-08-23
  • 1970-01-01
  • 1970-01-01
  • 2017-12-09
  • 1970-01-01
相关资源
最近更新 更多