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::vector
或 std::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
已更新LINK:https://ideone.com/g7jjVN
(阐明了扩展程序的原始来源)
#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::vector
或 std::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
已更新LINK:https://ideone.com/g7jjVN (阐明了扩展程序的原始来源)