C++ 是'x=&;v`和`*x=v`等效?
给出了这段代码,它们之间的区别是什么 1. <代码>x=&v,以及 2. <代码>*x=v?C++ 是'x=&;v`和`*x=v`等效?,c++,pointers,C++,Pointers,给出了这段代码,它们之间的区别是什么 1. x=&v,以及 2. *x=v? 我知道在这两种情况下,*x都包含7,但是x在这两种情况下都包含v的内存位置吗?如果没有,情况1和2中的x包含什么,这是两者之间唯一的显著区别吗?第一个为x赋值。第二个具有未定义的行为。给定以下语句: int * x; int v = 7; x = &v; v在内存中有一些位置。做: int v = 7; 将“x指向v的内存位置,实际上*x将具有值7 然而,在本声明中: int * x; int v =
我知道在这两种情况下,
*x
都包含7
,但是x
在这两种情况下都包含v
的内存位置吗?如果没有,情况1和2中的x
包含什么,这是两者之间唯一的显著区别吗?第一个为x
赋值。第二个具有未定义的行为。给定以下语句:
int * x;
int v = 7;
x = &v;
v
在内存中有一些位置。做:
int v = 7;
将“x
指向v
的内存位置,实际上*x
将具有值7
然而,在本声明中:
int * x;
int v = 7;
x = &v;
您正在将v
的值存储在x
指向的地址。但是x
没有指向有效的内存地址,因此该语句调用未定义的行为
所以要回答你的问题,不,这两种说法是不同的。这两种说法非常不同 最初
x
将包含垃圾值。因此,*x
将尝试取消对未初始化地址的引用,并导致未定义的行为(在大多数情况下是分段错误),因为*x
指的是未初始化的内容。因此,*x=v
将v
中的值赋给x
所指的位置
在
x=&v
中,x
将包含v
的地址。从这一点来看,x
包含v
的地址,*x
将引用v
中的值。因此,这种说法是正确的。因此,x=&v
将v
的地址指定为x
x=&v
修改x的值。操作后,x将指向v
*x=v
修改x指向的对象。在本例中,x不指向任何对象,因为指针未初始化。因此,行为是未定义的 和
表示地址
*
表示当前的值
在x=&v
中,v
的地址分配给x
在*x=v
-将x
处的值(地址x
处的值)分配给v
int v=7代码>
假设v=00zxcdfcdd2345的地址
intx=&v代码>
这里的“&”表示和的地址x用于存储地址*(00zxcdcdgdd2345)*
,而x本身存储在某个位置,比如*00254DBHJBDHDW*
现在,如果我们想访问v的值,我们使用指针
int*x=v代码>
在该语句中,'*x'是一个指针变量,指向v,表示它存储v的值,但x本身未定义,它存储垃圾值。
因此两者都不同。*x=v
是未定义的行为。“我理解在这两种情况下,*x包含7”-不。你的理解是错误的。您的第二个示例是-aka invalid/breaked/bad code。您的意思是执行这两个语句,即x=&v
后跟*x=v
?这将产生不同于仅执行一个或另一个的结果。具体来说,*x=v
通常会导致将数字7写入内存中的随机字节。如果幸运的话,程序会崩溃。如果你运气不好,你的进程记忆中只有一个随机的7。如果你真的很不走运,你会把7写入其他东西拥有的内存中。