0

*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;
4

8 回答 8

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
于 2012-10-08T18:34:31.067 回答
2

*x=i将存储在 指向的内存位置中的值更改x为等于存储在 中的值i

x=&i更改内存位置x指向i的内存位置。

x=i是错的。您很可能会遇到段错误。

*x=*i是错的。您不能取消引用i,因为i它不是指针。

*x=&i(实际上,更准确地说,*x=(int)&i)会将 的内存位置i作为整数存储在 指向的内存位置中x

于 2012-10-08T18:36:32.180 回答
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.
于 2012-10-08T18:32:34.843 回答
1

*x=i;取消引用指针x并分配i.

x=&i使指针x指向变量i.

于 2012-10-08T18:34:50.777 回答
1

*x = i更改存储在地址中的值,该地址存储在x. 在您的情况下,未经编辑,这将崩溃,因为该地址x可能是垃圾,可能是NULL. 你需要一个malloc()new什么的。

x = &i改变存储的地址x,这样就是变量的地址i。在您的示例中,这是非常安全的。

于 2012-10-08T18:35:24.567 回答
1

好吧,当你说

*x = i

你是说:使变量 x 指向值 i。当你说

x = &i

您是说使地址 x 指向 i 的地址。而且我想您应该能够自己弄清楚其他人!

于 2012-10-08T18:35:32.950 回答
1

*x = i 这实际上将 的值分配给i指向的内存位置x

x = &i 这将变量的地址分配给i指针变量xx应该是一个指针。

当你这样做时x = i,这会给你一个运行时错误,因为你试图错误地分配一个2不属于你的进程地址空间的地址(在这种情况下是)。要成功做到这一点,i还应该是一个指针,并且必须指向地址空间中的地址。

当你这样做时*x = *i,在你的情况下会再次给出错误。如果i是指针,则 指向的地址x将获得 指向的地址处的值i

于 2012-10-08T18:37:39.380 回答
1

*x = i将 2 分配给 x 指向的内存地址。请注意,这可能会崩溃,因为 x 尚未通过 malloc 或分配给缓冲区或堆栈变量的地址初始化为内存地址。

x = &i将指针分配给x变量的地址i

x = i会将指针分配x给 的值2,这很可能指向无效的内存地址并且需要强制转换。

*x = *i将取决于 的当前值x。而且由于i不是指针,因此您无法取消引用它。

*x = &i会将 的地址写入ix 指向的内存地址,这取决于它前面的代码。如果您没有将 x 分配给有效地址,它可能会崩溃。

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

于 2012-10-08T18:37:55.470 回答