【问题标题】:C99: What does "int const *ptr" mean? [duplicate]C99:“int const *ptr”是什么意思? [复制]
【发布时间】:2013-08-13 14:16:04
【问题描述】:

我正在查看 C99 规范 (N1256.pdf),上面写着 (p.11506):

const int *ptr_to_constant;
int *const constant_ptr;

"ptr_to_constant指向的任何对象的内容都不能通过那个指针来修改,但是ptr_to_constant本身可以被改变为指向另一个对象。同理,constant_ptr指向的int的内容可以修改,但是constant_ptr本身应始终指向同一个位置。” (6.7.5.1 指针声明器)

现在,根据我之前阅读的内容,以下两个语句会产生相同的行为。

int *const constant_ptr; /* This form is mentioned in the standard */
int const *constant_ptr; /* This form is NOT mentioned in the standard */

我想知道第二种形式是正确的还是只是扩展名。

提前致谢, -S

【问题讨论】:

    标签: c pointers constants c99


    【解决方案1】:

    其实int const *constant_ptr;const int *ptr_to_constant;是一样的。 const 关键字影响左边的元素,如果没有,就会影响右边的元素。

    int const *constant_ptr;,这里const左边的元素是int

    const int *ptr_to_constant;,这里const 左边没有元素,所以它适用于右边的元素,即int


    const int *ptr_to_constant; 
    

    这里只有指针指向的值是常量。

    int *const constant_ptr;
    

    这里,指针是常量。

    int const *constant_ptr;
    

    这里只有指针指向的值是常量。

    int const * const constant_ptr_to_constant;
    

    这里的指针和它所指向的值都是常量。

    编辑:

    int const *constant_ptr;,你称指针为constant_ptr,但如果我保留你的命名方案,它应该叫ptr_to_constant

    【讨论】:

    • 谢谢努尼。你能建议参考一下这种行为吗?
    • @user926918 This question 可能对您感兴趣。
    • 确实有关于解析的可能原因的有趣讨论,但它并没有解决我的问题。我再次检查了 C99 标准中的限定词规则,但据我所知,对这个问题保持沉默。也就是说,它并没有说最后一个语句是错误的、未指定的或未定义的。所以这让我怀疑这种做法似乎是对标准的扩展。
    • 符号int const *ptrint * const ptr 都是完全标准化的行为(但彼此不同)。您在问题中引用的内容是 2011 年标准(ISO/IEC 9899:2011)第 6.7.6.1 节指针声明符中的一个示例(因此从技术上讲,这是非规范性的,但对于这个问题并不重要)。第 6.7.6 节声明符中的语法清楚地显示了 '* type-qualifier-list-opt D' 其中 D 是声明符,而 'type-qualifier-list-opt' 允许 const 和其他限定符.
    • 感谢乔纳森·莱弗勒。我查看了该部分(C99 为 6.7.5),它看起来很强大并且需要更多时间。感谢您的参考。
    【解决方案2】:

    如果 `const' 关键字在星号的左边,并且是唯一的这样的关键字 在声明中,指针指向的对象是常量,然而, 指针本身是可变的。

    int a = 1;
    int b = 2;
    const int *p1;
    p1 = &a;
    p1 = &b; // Can be pointed to another variable
    *p1 = 23; // <----- NOT ALLOWED
    

    如果 `const' 关键字在星号的右侧,并且是唯一这样的关键字 在声明中,那么指针指向的对象是可变的,但是指针 是恒定的;即,指针一旦初始化,将始终指向同一个对象 在它的范围内。

    int a = 1;
    int b = 2; 
    int * const p2 = &a;
    *p2 = 7; // <----- Can assign a value via indirection
    p2 = &b; // <----- NOT ALLOWED
    

    如果 `const' 关键字在星号的两侧,则指针 并且指向的对象是常量。

    int a = 1;
    int b = 2;
    const int * const p3 = &b;
    *p3 = 42; // <------ NOT ALLOWED
    p3 = &a; // <------ NOT ALLOWED
    

    【讨论】:

      【解决方案3】:

      “const”关键字在这两种情况下修饰不同的东西。

      “const int *”表示不能改变的是“int”部分。

      “int *const”表示只有变量值本身(指针)不能改变。

      这在您引用的文本中有所说明,但方式更为复杂。

      试着做一些作业,看看有什么错误,你就会明白了。

      【讨论】:

      • 似乎有些混乱。我在询问标准中给出的第二种形式与未给出标准的形式。我将在问题中明确提及这一点。
      • @user926918 你提到的一切都在标准中——你误解了它。
      • 你说得对——我的错。我不确定“int const *constant_ptr;”是否是完全标准的(或者它符合或不符合哪个版本的标准),但我已经看到它在很多地方都使用过,并且肯定在实践中使用,并且应该在任何现代 C/C++ 编译器上编译。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-08
      • 2013-03-05
      • 2020-04-07
      • 2015-02-01
      • 1970-01-01
      • 2016-03-09
      • 2021-07-21
      相关资源
      最近更新 更多