有人可以解释我为什么不能这样做吗?
int *ptr;
int ival;
ptr = ival;
*ptr = 255;
当我对double
和int
值而不是int
和int *
值执行相同操作时,我只会有一个indirekt演员,为什么它不能用于最后一对?
答案 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;
的原因是因为编译器 - 就像我们这些人在阅读问题一样 - 无法分辨你正在尝试做的这两件事中的哪一件。永远不要让编译器弄明白你的意思;永远是明确的。
您可以使用double
和int
执行此操作,因为该语言定义了在数字数据类型之间进行转换的过程。该语言专门用 定义了在数值类型和指针类型之间进行转换的过程。不同的平台可以有不同的格式化指针的方式,并且不能保证甚至可能将指针表示为数值(这在C时更是一个问题)是第一次标准化,而不是今天)。当您添加手动类型转换时,您告诉编译器您知道自己在做什么,并且尝试进行不会尝试执行的转换是安全的。它自己的。