间接转换从int到int *

时间:2016-03-02 22:37:01

标签: c casting

有人可以解释我为什么不能这样做吗?

int *ptr;
int ival;
ptr = ival;
*ptr = 255;

当我对doubleint值而不是intint *值执行相同操作时,我只会有一个indirekt演员,为什么它不能用于最后一对?

2 个答案:

答案 0 :(得分:1)

写作时

ptr = ival;

表示您要将ival复制为ptr的值。如果您希望ptr指向存储ival的位置,则必须使用地址操作符&

ptr = &ival;

我怀疑你可能会感到困惑,因为当作业的右侧是阵列时,你不需要这样做,例如:你可以写。

char *ptr;
char cvar[10];
ptr = cvar;

这是一个特例,因为数组不能作为C中的值分配,当您尝试在该上下文中使用它们时,它们会自动衰减到指向其第一个元素的指针。所以最后一行被视为你写的:

ptr = &cvar[0];

此特殊行为仅适用于数组。

答案 1 :(得分:0)

你想在这做什么?如果您想要存储指向变量ival的指针,则需要使用ptr = &ival;。如果要将ival中存储的数值用作内存地址并将指针设置为该值,则需要执行ptr = (int*)ival;

你不能ptr = ival;的原因是因为编译器 - 就像我们这些人在阅读问题一样 - 无法分辨你正在尝试做的这两件事中的哪一件。永远不要让编译器弄明白你的意思;永远是明确的。

您可以使用doubleint执行此操作,因为该语言定义了在数字数据类型之间进行转换的过程。该语言专门用 定义了在数值类型和指针类型之间进行转换的过程。不同的平台可以有不同的格式化指针的方式,并且不能保证甚至可能将指针表示为数值(这在C时更是一个问题)是第一次标准化,而不是今天)。当您添加手动类型转换时,您告诉编译器您知道自己在做什么,并且尝试进行不会尝试执行的转换是安全的。它自己的。