4

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

int foo (const char* &bar)

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

bar = ...

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

4

3 回答 3

4

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

如果您更改bar为 be 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
于 2013-08-30T18:44:14.987 回答
4

如果指针是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
于 2013-08-30T18:45:57.053 回答
2

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

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


const char * & bar

baris not const, *baris 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*; 它必须是 a const char*,所以除非调用者抛弃 const-ness (这是一件坏事),否则他们不会修改内存。这意味着函数可以安全地返回指向内部数据的指针,知道它不会被修改。

于 2013-08-30T18:51:25.357 回答