【问题标题】:Pointer arithmetic and const qualifier in CC中的指针算术和const限定符
【发布时间】:2011-01-24 19:45:02
【问题描述】:

在下面这段代码中,计算strlen,

int s(const char* str)
{   
    int count=0;        
    while(*str++) count++;
    return count;
}

您可以看到参数 str 是 const。但是,当我执行 str++ 时,编译器不会抱怨。我的问题是

当将指针作为参数传递给 C 函数时,如果 is 用 const 限定,我怎样才能对其执行指针运算?上述函数中的 const 是什么?

【问题讨论】:

  • 谢谢!所以,如果我像编译器看到的那样给上面的声明加上括号,它看起来像 (const char) *str,使 const 限定了 char。如果我把它改成 const char * const str,它看起来像 (const char) (const char(*str))

标签: c++ c


【解决方案1】:
const char* str;

表示指向 const 数据的非 const 指针。

char* const str;

表示指向非常量数据的 const 指针。

const char* const str;

表示指向 const 数据的 const 指针。

原因是在 C++ 中,变量类型声明是从右到左解析的,这导致单词“const”总是定义它最接近的事物的 const 性。

【讨论】:

  • 不是说变量声明是从右到左解析的。黄金法则:“声明模仿使用”。那是因为您可能需要解析更复杂的内容,例如 void (* var [])(int, char *)
【解决方案2】:

它不是声明指针const,而是将指向的东西声明为const。试试这个:

int s(const char* const str)

使用此声明,您在修改str 时应该会收到编译错误。

【讨论】:

    【解决方案3】:
    const char * ch; // non-const pointer to const data
    char * const ch; // const pointer to non-constant data.
    
    const char * const ch; // const pointer to const data
    

    注意: 还有

    const char * ch;
    

    等于

    char  const * ch;
    

    【讨论】:

      【解决方案4】:

      指针指向一个const char,一个只读字符数组。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-02
        • 2016-01-09
        • 1970-01-01
        • 1970-01-01
        • 2011-08-31
        • 1970-01-01
        • 2010-10-20
        相关资源
        最近更新 更多