【问题标题】:Unable to understand what is happening in a two-dimensional array pointer无法理解二维数组指针中发生了什么
【发布时间】:2021-07-18 21:11:58
【问题描述】:

我是指针的新手,在尝试理解它们时遇到了一些问题。

现在我通过here 查找了这个问题。我对解决方案不是 100% 满意。所以我自己做了一些检查,看看会发生什么。

我想要一个指向二维数组的指针,所以我尝试了:

int arr[2][3] = {{12,23,4},{323,43,3}};
int (*ptr)[3] = arr; // A pointer to the first element of array.
                     // The first element of array is an array of three ints.

我运行了以下代码:

std::cout<<ptr<<std::endl;
std::cout<<*ptr<<std::endl;

现在我得到的结果让我有点困惑:

0x61fdc0
0x61fdc0

两次显示相同的输出。引用后指针和值的地址怎么会一样呢?这种行为是否类似于双指针?像this 这样的解释会很有帮助。

【问题讨论】:

标签: c++ arrays pointers multidimensional-array


【解决方案1】:

数组可以衰减为指针。实际上,您在写作时使用了这个事实:

int (*ptr)[3] = arr;

ptr 是“指向数组第一个元素的指针”。二维数组 arr 在您使用它初始化 ptr 时确实衰减为指向其第一个元素的指针。

当您取消引用 ptr 时,您会得到第一个元素(arr),一个一维数组,当您通过打印它时

std::cout << *ptr << std::endl;

你会打印它的地址,因为数组衰减到指向它的第一个元素的指针。

正如您链接的答案所解释的,数组的地址和它的第一个元素的地址是相同的:

以下是指向两者中第一个的等效方法 项目。

int (*p)[3] = a; // as before
int (*p)[3] = &(a[0]);

【讨论】:

  • 谢谢,我洗澡的时候也想了想,有点想通了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-26
  • 2018-11-02
  • 1970-01-01
  • 1970-01-01
  • 2014-01-08
  • 2017-04-22
  • 2021-12-17
相关资源
最近更新 更多