指针C++差异
Pointers in C++ difference
让我们假设这段代码:
int a;
int * point;
a = 5;
point = &a; // <-----
我正在箭头的行与
...*point = a;
。还是有区别?
-
point = &a;
使"点"指向"a"。 -
*point = a;
将"a"的值分配给已经是的任何"点"指向。
"点"包含一个地址。"&"从变量中获取地址。 point = &a;
获取"a"的地址,并将其分配给指针。
"*"引用指针(获取它指向的变量),因此*point = a
将"a"的值分配给取消引用的指针 - 即指针中已经存储的任何变量地址。
完全不同。
point = &a;
表示"point
现在包含a
的地址"。
*point = a;
表示"point
指向的(当前未定义的)内存区域现在包含a
的值"。 该版本可能会崩溃。
不同之处在于您正在取消引用当时可能具有无效地址的point
。它实际上不会将值写入point
具有的位置。
不,它们不一样:
*point = a;
要求point
已经指向当前程序中的有效内存,它不会,因此将是未定义的行为。 而这一行:
point = &a;
将分配给point
现有对象的地址。
第一行将 (&a
) 的地址分配给指针。
第二行通过指针 (*pointer
) 将 a 的值分配给指向的内存块。
注意:如果指针未指向作用域中变量的地址或动态分配的地址,则在第二种情况下会导致内存损坏。
实际上,这个
*point = a;
可能会崩溃,因为您尚未分配point
将指向的内存。它也没有指向堆栈变量 - 在这种情况下,它会将该堆栈变量的值更改为a
。
换句话说,point
没有指向任何东西,你正在尝试设置那个不存在的"对象"的值。
相关文章:
- 将两个数组中的差异记录在第三个数组中
- 大小相等但成员数量不同的结构之间的性能差异
- C++constexpr实现差异
- 旧版c++中结构和类之间的差异
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 节点 *temp; 和节点 *tmp = 新节点之间的差异
- GCC 和 Clang 代码性能的巨大差异
- 类内部和外部静态 constexpr 元组之间的差异
- 平凡类型与非平凡类型的复制消除差异
- 了解算法的性能差异(如果以不同的编程语言实现)
- 以天C++为单位的两个时间戳之间的差异
- 如何以毫秒为单位获取开始时间和 now() 之间的毫秒差异(以 C++为单位?
- 方括号 [] 和括号 () 之间的犰狳库差异
- 不同语言中的模运算符差异
- std::filesystem 和 std::experimental::filesystem 之间的路径差异
- C++语法差异:二维和一维数组(指针算术)
- 获取 2 个数字之间的差异百分比
- AVX 指令中寄存器和指针之间的客观差异
- 基于范围的 for 循环range_declaration中各种说明符之间的性能差异
- 字符和整数中 **(ptr+1) 的值差异