我有这段C ++代码,我觉得有点混乱:
int foo (const char* &bar)
在这种情况下,如果我想将条形指针写为:
bar = ...
没关系。那么我应该如何理解const
。与指针不同的const指针如何指向const值?
答案 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*
,所以除非调用者抛弃常量(这是一件坏事),否则它们不会修改内存。这意味着该函数可以安全地返回指向内部数据的指针,因为它知道它不会被修改。