cpp双指针与二维数组指针

cpp double pointer vs 2 dimensional array pointer

#include <iostream>

int main() {
    int a[2][2] = {{1,2}, {3,4}};
    int *c = *a;
    int **b = &c;
    std::cout << **(a+1);  // outputs 3
    std::cout << **(b+1);  // segmentation fault
}

为什么一个 cout 导致分段错误而另一个没有?他们不应该指的是相同的价值吗?

在此声明中

cout << **(b+1);

表达式 b+1 指向数组外部(更准确地说是对象 c 外部)。你应该写

cout << *( *b + 2 );

解除引用的指针b指向二维数组第一个元素的指针。当向它添加类型为 int[2] 的数组中的元素数时,您将获得指向二维数组的第二个 "row" 的第一个元素的指针。现在您需要再次取消引用它以输出指向的值。

让我们从

开始
int *c;

其实之前的东西没那么重要,因为c只是一个指针然后这里

int **b = &c;

您将 c 的地址存储在 b 中。 c的地址与c中存储的值无关。 c 只是一个指针,获取它的地址并不能让你神奇地访问一个二维数组。

cout << **(b+1); // segmentation fault

已经 b+1 是未定义的行为。取消引用该指针不能给你一些有意义的东西。

PS: 老实说,我不能在这里告诉你如何正确使用双指针。一旦我开始学习 C++,我就忘记了我所知道的关于通过指针处理数组的任何知识。使用 std::vectorstd::array 省去一些麻烦。

我重写了代码以突出显示正在发生的事情,如下所示:

#include <iostream>

int main() {
  int a[2][2] = {{1,2}, {3,4}};
  int *c[2] = {a[0], a[1]};
  int **b = c;

  std::cout << **(a  ) << ','; // outputs 1
  std::cout << **(b  ) << ";\n"; // outputs 1
  std::cout << **(a+1) << ','; // outputs 3
  std::cout << **(b+1) << ";\n"; // outputs 3
}

LINK: https://ideone.com/ixj3NV

已更新LINKhttps://ideone.com/g7jjVN (阐明了扩展程序的原始来源)