C++ 是'x=&;v`和`*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 =

给出了这段代码,它们之间的区别是什么 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 = 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写入其他东西拥有的内存中。