* x = i和x =& i之间有什么区别?

时间:2012-10-08 18:31:43

标签: c pointers

*x=ix=&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;

8 个答案:

答案 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=ix指向的内存位置中存储的值更改为等于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的地址分配给指针变量xx应该是指针。

执行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分配给有效地址,它可能会崩溃。

其中一些调用需要强制转换才能在语法上正确。