使用指针的索引括号取消对它的引用

Does using index brackets for a pointer dereference it?

本文关键字:取消 引用 指针 索引      更新时间:2023-10-16

使用索引括号的指针也取消引用吗?为什么把这个指针的第0个下标打印两次结果却不一样呢?

#include <cstdlib>
#include <iostream>
#include <cstring>
using namespace std;
int *p;
void fn() {
    int num[1];
    num[0]=99;
    p = num;
}
int main() {
    fn();
    cout << p[0] << "  " << p[0];
}

使用索引括号的指针也取消引用吗?

正确,指针运算等价于数组索引。p[index]*(p+index)相同

为什么打印指针的第0个索引两次最终打印两个不同的东西?

因为您使用p指向一个局部变量(num),其作用域在fn()函数结束时结束。您观察到的是未定义行为。返回指向局部变量的指针是不好的做法,必须避免。

顺便说一下,如果将num数组的定义移到fn()函数之外,那么您将看到一致的cout行为。

或者,如@Marc。2377建议,为了避免全局变量(这是不好的做法),您可以在堆中分配变量(int* num = new int[1];)。然后从fn()返回指针p是可以的,但不要忘记在main()之后调用delete[] p

数组被分配连续的内存位置(所有元素都是连续存储的),所以A[i](数组第i个索引处的元素)将距离数组A的基址i个内存单元。
因此A[i]等价于*(A + i)。

指针存储的是地址,而不是其中的内容。因此,局部变量不再存在于函数之外(局部作用域),从而在函数之外给出不同的结果。

使用索引括号的指针也取消引用吗?

是的,它有。ptr[i]等价于*(ptr + i)

访问超出作用域的局部变量num是未定义的行为。本质上,p指向一个局部变量num。从fn()返回后,num将超出作用域,因此任何内容都可以存储在其地址