代码之家  ›  专栏  ›  技术社区  ›  ClementNerma

如何在C中生成“实”常量?[副本]

  •  -2
  • ClementNerma  · 技术社区  · 8 年前

    我最近研究了指针如何处理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 并从中创建一个指针,以便修改其值。这意味着 十、 不是 真正地 常数有办法做到吗 真正地 常数

    编辑: 这个问题不是重复的 this one 当我在这里问我们如何 实常数 ,而不是如何通过指针更改常量。

    1 回复  |  直到 7 年前
        1
  •  4
  •   melpomene    8 年前

    首先, const 不定义常量;它定义只读变量。

    生产线

    y = &x;
    

    是类型错误;您的编译器应该对此表示不满(“赋值丢弃限定符”或类似的内容)。

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

    为了得到一个实常数,您需要使用 enum :

    enum { x = 1 };
    

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

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

    常见的替代方法是宏:

    #define X 1
    

    这在语言层面上不是一个常数;相反,预处理器只是替换 X 通过 1 在编译期间。