欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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
相关标签: C++指针

上一篇:

下一篇: