二维数组的指针

3

有这样的代码:

int (*ptr_)[1] = new int[1][1];
ptr_[0][0] = 100;
std::cout << "to: " << &ptr_ << ' ' << ptr_ << ' ' << *ptr_ << ' ' << &(*ptr_) << ' ' << **ptr_ << std::endl;

结果是:

to: 0xbfda6db4 0x9ee9028 0x9ee9028 0x9ee9028 100

为什么ptr_和*ptr_的值相同?ptr_的值等于0x9ee9028,所以内存单元0x9ee9028的值是*ptr_,即0x9ee9028,但**ptr_的结果是100。这合乎逻辑吗?


我很好奇答案会是什么,但我相信它与数组本质上就是指针有关。 - Pat
2
@Pat:你的意思是,数组类型的变量 本质上就是指针。 </ 爱挑剔的> - Fred Foo
@larsmas:因此我的回答并不是答案,哈哈。:P - Pat
我意识到我来晚了,但请不要像Pat那样写这样的话。我知道你意识到其中的微妙之处,但就目前而言,你的评论只是危险的。 - Lightness Races in Orbit
2个回答

3

ptr_ 是长度为一的数组的指针。在 C 和 C++ 中,数组类型的变量在打印时(及其他情况下)会简单地降级为指针。因此,当您打印 ptr_ 时,您会得到该数组的地址。而当您打印 *ptr_ 时,您会得到数组本身,然后又会直接降级回同一个指针。

但是在 C++ 中,请使用智能指针和标准容器。


数组不会退化为指针。数组类型的变量会衰变为指针类型的变量,但是数组本身并不会受到损害。 - Lightness Races in Orbit

1
int main() {
  int test[2][3] = { {1,2,3}, {4, 5, 6} };
  int (*pnt)[3] = test; //*pnt has type int[3]

  //printArray writes array to stdout
  printArray(3, *pnt); //returns 1 2 3
  printArray(3, *(pnt+1)); //returns 4 5 6
  return 0;
}

多维数组实际上是数组的数组,例如test [2] [3]是一个具有两个元素的数组,并且这些元素是int [3]类型的,而int [3]又有三个整数元素。

在你的情况下,你有一个指向变量的指针。

换句话说,你的数组看起来像这样:

array = {{100}}
  1. ptr_ 指向数组
  2. &ptr_ 是外部数组的地址
  3. ptr_ 是第一个元素的地址(它指向另一个数组)
  4. *ptr_ 与上面相同
  5. &(*ptr_) 获取外部数组的第一个元素(即内部数组),然后返回内部数组的地址
  6. **ptr_ 获取外部数组的第一个元素(即内部数组),然后取消引用内部数组,得到实际值

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