为何二维数组指针ptr与*ptr输出值相同?如何打印ptr[0]?
问题解答
为什么ptr和*ptr输出结果相同?
首先明确ptr的类型:int (*ptr)[3]是指向包含3个int元素的数组的指针。
在C++中,二维数组M的名字会隐式退化为指向其第一个元素的指针——这里M的第一个元素是M[0](一个int[3]类型的数组),所以ptr = M是合法的,此时ptr指向的是M[0]这个数组的起始地址。
当你用cout输出ptr时,打印的是这个指针存储的地址值,也就是M[0]的起始地址。
而*ptr是对ptr的解引用,得到的是M[0]这个数组本身。但在表达式中,数组名又会再次隐式退化为指向其第一个元素(M[0][0])的指针,这个指针的地址值同样是M[0]的起始地址。
所以两者输出的地址值完全一致,看起来结果相同。
如何打印ptr[0]的内容?
ptr[0]等价于*(ptr + 0),也就是*ptr,对应M[0]这个一维数组。要打印它的所有元素,可以用循环遍历:
#include <iostream> using namespace std; int main(void) { int M[3][3]={{1,2,3},{4,5,6},{7,8,9}}; int (*ptr)[3]; ptr = M; // 打印ptr[0]的所有元素 cout << "ptr[0]的内容:"; for (int i = 0; i < 3; ++i) { cout << ptr[0][i] << " "; } cout << endl; return 0; }
运行这段代码会输出:ptr[0]的内容:1 2 3
你也可以直接把ptr[0]转换成int*指针来遍历,效果是一样的:
int* arr_ptr = ptr[0]; for (int i = 0; i < 3; ++i) { cout << arr_ptr[i] << " "; }
内容的提问来源于stack exchange,提问作者user21556643
相关产品推荐
相关产品推荐

