*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;
答案 0 :(得分:5)
*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
答案 1 :(得分:2)
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.
答案 2 :(得分:2)
*x=i
将x
指向的内存位置中存储的值更改为等于i
中存储的值。
x=&i
更改内存位置x
指向i
的内存位置。
x=i
错了。你很可能会遇到段错误。
*x=*i
错了。您无法取消引用i
,因为i
不是指针。
*x=&i
(实际上,更恰当地说,*x=(int)&i
)会将i
的内存位置作为整数存储在x
指向的内存位置。
答案 3 :(得分:1)
*x=i;
取消引用指针x
并指定i
。
x=&i
使指针x
指向变量i
。
答案 4 :(得分:1)
*x = i
更改存储在x
中的地址中的值。在您的情况下,未经编辑,会崩溃,因为地址x
可能是垃圾,可能是NULL
。您需要malloc()
或new
或其他内容。
x = &i
更改x
中存储的地址,因此这是变量i
的地址。这在您的示例中非常安全。
答案 5 :(得分:1)
好吧,当你说
*x = i
你说的是:让变量x指向值i。 当你说
x = &i
你说的是地址x指向i的地址。 而且我猜你应该能够自己解决其他问题了!
答案 6 :(得分:1)
*x = i
这实际上将i
的值分配给x
指向的内存位置。
x = &i
这会将变量i
的地址分配给指针变量x
。 x
应该是指针。
执行x = i
时,这会给您一个运行时错误,因为您试图错误地分配一个不属于地址空间的地址(在本例中为2
)你的过程。要成功执行此操作,i
也应该是指针,并且必须指向地址空间中的地址。
执行*x = *i
时,在您的情况下将再次出错。如果i
是指针,则x
指向的地址将获得i
指向的地址处的值。
答案 7 :(得分:1)
*x = i
为x指向的内存地址分配2。请注意,这可能会崩溃,因为x尚未通过malloc初始化为内存地址,或者分配给缓冲区或堆栈变量的地址。
x = &i
将指针x
指定给变量i
的地址。
x = i
会将指针x
分配给2
的值,这很可能指向无效的内存地址,并且需要强制转换。
*x = *i
取决于x
的当前值。由于i
不是指针,因此您无法取消引用它。
*x = &i
会将i
的地址写入x指向的内存地址,这取决于前面的代码。如果您没有将x分配给有效地址,它可能会崩溃。
其中一些调用需要强制转换才能在语法上正确。