我最近看了一下指针如何处理C中的常量,我读到有关常量的指针可能导致修改它们:
#include <stdio.h>
int main (int argc, char ** argv) {
const int x = 1;
int *y;
y = &x;
*y += 1;
printf("x = %d\n", x); // Prints: 2
printf("y = %d\n", *y); // Prints: 2
return 0;
}
在这里,我定义一个名为x
的常量并从中创建一个指针,以便我可以修改它的值。这意味着x
不是真正的常量。有没有办法让真的不变?
编辑:此问题不是this one的重复,因为我在这里问我们如何制作实常数,而不是如何更改常量通过指针。
答案 0 :(得分:4)
首先,const
没有定义常量;它定义了只读变量。
该行
y = &x;
是类型错误;你的编译器应该抱怨(“赋值放弃限定符”或类似的东西)。
*y += 1
尝试修改只读对象。这不仅保证不起作用,而且还有不确定的行为(即任何事情都可能发生)。
为了使实际常数,您需要使用enum
:
enum { x = 1 };
现在&x
是一个错误,因为常量不在内存中而且没有地址。
不幸的是,这种技术仅适用于整数。
常见的替代方案是宏:
#define X 1
这不是语言层面的常数;相反,预处理器只是在编译期间将任何X
替换为1
。