使用指针的索引括号取消对它的引用
Does using index brackets for a pointer dereference it?
使用索引括号的指针也取消引用吗?为什么把这个指针的第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
将超出作用域,因此任何内容都可以存储在其地址
相关文章:
- C++取消引用指针.为什么会发生变化
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 取消引用运算符不能重载
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- C++ 关于指针取消引用的技术问题
- 没有取消引用/解包对象的标准方法?
- 列表 iter 不取消引用 使用列表进行插入排序
- 在这个函数中是有缺陷的,因为取消引用 null 是无效的,所以我想更改代码
- 取消引用结束指针到数组类型的一个
- 取消引用向量时出现问题
- 取消引用指向整数的指针时获得不同的结果
- C++:取消引用十六进制值,有点语法问题
- C/C++ 取消引用错误:在空检查之前取消引用
- 取消引用后C++空测试
- 立即取消引用unique_ptr
- 如何在不使用临时变量的情况下取消引用返回指针的函数的返回值?
- 取消引用 void 指针以将值分配给结构
- boost_multi_index迭代器取消引用给出常量
- 矢量迭代器不能与 std::shared_ptr<> 取消引用
- C++我们可以取消引用此指针吗?如果是这样,那么如何,如果不是,那为什么?