二维数组的指针

时间:2011-09-30 15:42:36

标签: c++

有这样的代码:

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.是否合乎逻辑?

2 个答案:

答案 0 :(得分:3)

ptr_是指向长度为1的数组的指针。 C和C ++中数组类型的变量在打印时会降级为指针(除其他外)。因此,当您打印ptr_时,您将获得该数组的地址。当你打印*ptr_时,你会得到数组本身,然后再次降级回同一个指针。

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

答案 1 :(得分: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;
}

mutl-dimentional数组实际上是数组的数组,例如test [2] [3]是一个数组,其中包含两个int [3]类型的元素,而这些元素又有3个整数元素。

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

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

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