*x=i
和 和有什么不一样x=&i
?
代码:
int i=2;
int *x;
*x=i; //what is the difference between this...
x=&i; //...and this??
//Also, what happens when I do these? Not really important but curious.
x=i;
*x=*i;
*x=i; //what is the difference between this...
这会将 的值分配给i
存储在指向的地址的整数x
x=&i; //...and this??
这将分配到的i
地址x
。
请注意,在您的示例x
中未分配,因此*x=i
未定义的行为。
这是一个更好的说明:
int i = 2, j = 5;
printf("%d %d\n", i, j); // Prints 2 5
int *x = &j;
*x = i;
printf("%d %d\n", i, j); // Prints 2 2
*x=i
将存储在 指向的内存位置中的值更改x
为等于存储在 中的值i
。
x=&i
更改内存位置x
指向i
的内存位置。
x=i
是错的。您很可能会遇到段错误。
*x=*i
是错的。您不能取消引用i
,因为i
它不是指针。
*x=&i
(实际上,更准确地说,*x=(int)&i
)会将 的内存位置i
作为整数存储在 指向的内存位置中x
。
int i=2;
int *x;
*x=i; // x is not initialized, this is undefined behavior
x=&i; // this assigns the address of i to x
和
*x=&i; // is invalid C. You cannot assign a pointer to an
// integer without an explicit conversion.
*x=i;
取消引用指针x
并分配i
.
x=&i
使指针x
指向变量i
.
*x = i
更改存储在地址中的值,该地址存储在x
. 在您的情况下,未经编辑,这将崩溃,因为该地址x
可能是垃圾,可能是NULL
. 你需要一个malloc()
或new
什么的。
x = &i
改变存储的地址x
,这样就是变量的地址i
。在您的示例中,这是非常安全的。
好吧,当你说
*x = i
你是说:使变量 x 指向值 i。当你说
x = &i
您是说使地址 x 指向 i 的地址。而且我想您应该能够自己弄清楚其他人!
*x = i
这实际上将 的值分配给i
指向的内存位置x
。
x = &i
这将变量的地址分配给i
指针变量x
。x
应该是一个指针。
当你这样做时x = i
,这会给你一个运行时错误,因为你试图错误地分配一个2
不属于你的进程地址空间的地址(在这种情况下是)。要成功做到这一点,i
还应该是一个指针,并且必须指向地址空间中的地址。
当你这样做时*x = *i
,在你的情况下会再次给出错误。如果i
是指针,则 指向的地址x
将获得 指向的地址处的值i
。
*x = i
将 2 分配给 x 指向的内存地址。请注意,这可能会崩溃,因为 x 尚未通过 malloc 或分配给缓冲区或堆栈变量的地址初始化为内存地址。
x = &i
将指针分配给x
变量的地址i
。
x = i
会将指针分配x
给 的值2
,这很可能指向无效的内存地址并且需要强制转换。
*x = *i
将取决于 的当前值x
。而且由于i
不是指针,因此您无法取消引用它。
*x = &i
会将 的地址写入i
x 指向的内存地址,这取决于它前面的代码。如果您没有将 x 分配给有效地址,它可能会崩溃。
其中一些调用需要强制转换才能在语法上正确。