C++中指针数组使用过程中的问题
程序员文章站
2023-12-26 10:52:15
...
起因:以下程序片段
int main()
{
int a = 10, b = 20, c = 30;
int *p[3] = {&a, &b, &c};
cout << (*p)[0] << endl;
cout << (*p)[1] << endl;
cout << (*p)[2] << endl;
return 0;
}
实际输出结果为:
10
0
-413206008
期望输出应该为
10
20
30
分析如下:
指针数组与一般数组并无不同,只是指针数组是用来存放地址的数组。那么同样的数组名应该为指针数组的首地址。
cout << p << endl;
cout << &p[0] << endl;
// 这两个语句输出的是相同的地址
// 0x7ffee38d9a10
// 0x7ffee38d9a10
(*p) // p是数组名,则*p取得该地址中所存放的内容
p
即是p[0]
的地址,(*p)
也就是取p[0]
中所存放的内容,也就是a
的地址。
cout << p[0] << endl;
cout << &a << endl;
// 输出如下:
// 0x7ffee0b96a08
// 0x7ffee0b96a08
所以(*p)
操作得到的就是a
的地址,假设a
是一个数组,那么数组名a
是这个数组的首地址,那么a[0]
为这个数组的第一个元素,即10。问题是a
现在并不是一个数组,变量名a
的地址对应的值是10。
若取(*p)[1] (*p)[2]…
则会得到多个随机值
for (int i = 0; i < 10; i++) {
cout << (*p)[i] << endl;
}
// 输出如下
/*
10
0
-311088632
32766
-311088636
32766
-311088640
32766
-1132592939
658762414
*/
类似(*p)[x]
的访问方法只能正确访问第一个元素,后面的则都是非法访问。
正确的访问指针数组中的元素应该引入中间指针变量来进行访问。
int a = 10, b = 20, c = 30;
int *p[3] = {&a, &b, &c};
int *tmp = nullptr;
for (int i = 0; i < 3; i++) {
tmp = p[i];
cout << *tmp << endl;
}
// 输出结果为:
// 10
// 20
// 30