指针C++差异

Pointers in C++ difference

本文关键字:差异 C++ 指针      更新时间:2023-10-16

让我们假设这段代码:

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没有指向任何东西,你正在尝试设置那个不存在的"对象"的值。