输出指针上的const前缀

时间:2013-08-30 18:42:10

标签: c++ pointers const

我有这段C ++代码,我觉得有点混乱:

int foo (const char* &bar)

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

bar = ...

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

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:4)

如果指针是const,则不允许指定指针。 E.g。

char * const bar;

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

如果指针指向const值,则不允许指定指针指向的值。 E.g。

const char *bar;

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

答案 2 :(得分:2)

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

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


const char * & bar

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


char const * & bar

与上述相同。


char * const & bar

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


const char * const & bar

bar*bar都是const。你无法改变任何事情。


char * & const bar

这是一个错误。


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