【问题标题】:const prefix on output pointers输出指针上的 const 前缀
【发布时间】:2013-08-30 18:42:09
【问题描述】:

我有这段 C++ 代码,我觉得有点困惑:

int foo (const char* &bar)

在这种情况下,如果我想写入条形指针为:

bar = ...

没关系。那么我应该如何理解这个const。与指针不同的 const 指针如何指向 const 值?

【问题讨论】:

  • 这段代码包含一个引用,所以我删除了“C”标签。
  • bar 是对指向 const 内存的指针的引用
  • @Dave 没错。有点 const 阅读障碍...
  • 这就是为什么与传统相反,const 应该始终写在右侧

标签: c++ pointers constants


【解决方案1】:

const 适用于它左边的任何东西,除非它左边没有任何东西,在这种情况下它适用于它右边的任何东西。这意味着在您的情况下,bar 是对指向const char 的指针的引用。 bar本身不是常量,可以修改。

如果您将bar 更改为char * const &bar,即对指向char 的常量指针的引用,您将无法进行该分配。示例:

int foo (char * const &bar)
{
    bar = 0;
    return 1;
}

并尝试编译它:

$ clang++ -c -o example.o example.cpp
example.cpp:3:9: error: read-only variable is not assignable
    bar = 0;
    ~~~ ^
1 error generated.
make: *** [example.o] Error 1

如果这些声明给您带来麻烦,您可以使用 cdecl/c++decl 解析它们:

$ c++decl
Type `help' or `?' for help
c++decl> explain const char * &bar
declare bar as reference to pointer to const char
c++decl> explain char * const &bar
declare bar as reference to const pointer to char

【讨论】:

    【解决方案2】:

    如果指针是const,则不允许分配给指针。例如

    char * const bar;
    
    bar = ...; // This is invalid
    *bar = ...; // This is OK
    bar[i] = ...; // This is OK
    

    如果指针指向const 值,则不允许分配指针指向的内容。例如

    const char *bar;
    
    bar = ...; // This is OK
    *bar = ...; // This is invalid
    bar[i] = ...; // This is invalid
    

    【讨论】:

      【解决方案3】:

      我将添加一些示例。也许这会让某些人更清楚:

      空格在这些中没有任何区别,所以我将它们放在任何地方以避免歧义。


      const char * & bar
      

      barnot const,*bar 是 const(这也意味着 bar[0] 等)。如果更改bar,它现在将指向新内存(如新数组),但旧数据将保持不变。


      char const * & bar
      

      同上。


      char * const & bar
      

      bar 现在是 const(您不能将其更改为指向不同的内存),但可以更改内存本身(*bar


      const char * const & bar
      

      bar*bar 都是常量。你不能改变任何东西。


      char * & const bar
      

      这是一个错误。


      您找到的代码使用第一种形式(实际上)返回一个const char 数组。不允许调用者传递char*;它必须是const char*,所以除非调用者抛弃了常量(这是一件坏事),否则他们不会修改内存。这意味着函数可以安全地返回指向内部数据的指针,知道它不会被修改。

      【讨论】:

        猜你喜欢
        • 2023-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-06
        • 2015-09-10
        • 1970-01-01
        相关资源
        最近更新 更多