如何在C中创建“真实”常量?

时间:2018-04-08 14:54:08

标签: c pointers const

我最近看了一下指针如何处理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的重复,因为我在这里问我们如何制作实常数,而不是如何更改常量通过指针。

1 个答案:

答案 0 :(得分:4)

首先,const没有定义常量;它定义了只读变量。

该行

y = &x;

是类型错误;你的编译器应该抱怨(“赋值放弃限定符”或类似的东西)。

*y += 1尝试修改只读对象。这不仅保证不起作用,而且还有不确定的行为(即任何事情都可能发生)。

为了使实际常数,您需要使用enum

enum { x = 1 };

现在&x是一个错误,因为常量不在内存中而且没有地址。

不幸的是,这种技术仅适用于整数。

常见的替代方案是宏:

#define X 1

这不是语言层面的常数;相反,预处理器只是在编译期间将任何X替换为1