让我们假设这段代码:
int a;
int * point;
a = 5;
point = &a; // <-----
我指的线是一样的...
*point = a;
...还是有区别?
point = &a;
使'point'指向'a'。*point = a;
将 'a' 的值分配给任何 'point' 已经指向的东西。'point' 包含一个地址。'&' 从变量中获取地址。
point = &a;
获取“a”的地址,并将其分配给指针。
'*' 引用一个指针(获取它指向的变量),因此*point = a
将 'a' 的值分配给取消引用的指针 - 即,无论变量的地址已经存储在指针中。
完全不同。
point = &a;
表示“point
现在包含”的地址a
。
*point = a;
表示“point
现在指向的(当前未定义的)内存区域包含”的值a
。该版本可能会崩溃。
不同之处在于您正在取消引用point
,此时可能有无效的地址。它实际上不会将值写入该位置point
。
不,它们不一样:
*point = a;
要求point
已经指向当前程序中的有效内存,它不会,因此将是未定义的行为。而这一行:
point = &a;
将分配给point
现有对象的地址。
第一行将 ( &a
) 的地址分配给指针。
第二行将 a 的值分配给指针 ( ) 指向的内存块*pointer
。
注意:如果指针没有指向范围内变量的地址,或者没有指向动态分配的地址,则在第二种情况下会导致内存损坏。
其实这
*point = a;
可能会崩溃,因为您尚未分配point
要指向的内存。它也不是说堆栈变量-在这种情况下,它将将该堆栈变量的值更改为a
.
换句话说,point
没有指向任何东西,并且您正在尝试设置该不存在的“对象”的值。