我正在运行一些示例程序来重新熟悉C++,我遇到了以下问题.首先,这是示例代码:
void print_string(const char * the_string)
{
cout << the_string << endl;
}
int main () {
print_string("What's up?");
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,print_string的参数可能已经改为const char * const the_string
.哪个更合适呢?
我理解不同之处在于,一个是指向常量字符的指针,而另一个是指向常量字符的常量指针.但为什么这两个都有效呢?什么时候相关?
Ken*_*art 233
后者阻止你修改the_string
内部print_string
.它实际上在这里是合适的,但也许冗长会推迟开发者.
char* the_string
:我可以改变char
到哪个the_string
点,我可以修改char
它指向的位置.
const char* the_string
:我可以改变char
到哪个the_string
点,但我不能修改char
它指向的位置.
char* const the_string
:我无法改变char
到哪个the_string
点,但我可以修改char
它指向的位置.
const char* const the_string
:我不能改变char
到哪个the_string
点,也不能修改char
它指向的位置.
Jam*_*are 130
指向可变字符的可变指针
char *p;
Run Code Online (Sandbox Code Playgroud)指向常量字符的可变指针
const char *p;
Run Code Online (Sandbox Code Playgroud)指向可变字符的常量指针
char * const p;
Run Code Online (Sandbox Code Playgroud)指向常量字符的常量指针
const char * const p;
Run Code Online (Sandbox Code Playgroud)Naw*_*waz 27
const char * const
意味着指针以及指针指向的数据,有两个常量!
const char *
表示只有指针指向的数据是const.然而,指针本身不是const.
例.
const char *p = "Nawaz";
p[2] = 'S'; //error, changing the const data!
p="Sarfaraz"; //okay, changing the non-const pointer.
const char * const p = "Nawaz";
p[2] = 'S'; //error, changing the const data!
p="Sarfaraz"; //error, changing the const pointer.
Run Code Online (Sandbox Code Playgroud)
Gar*_*ett 18
(我知道这已经过时了,但无论如何我想分享.)
只是想详细说明Thomas Matthews的回答.C类型声明的左右规则几乎说:当读取C类型声明时,从标识符开始,然后在可以时向右移动,在不能时向左移动.
最好用几个例子来解释:
从标识符开始,我们不能向右走,所以我们向左走
const char* const foo
^^^^^
Run Code Online (Sandbox Code Playgroud)
foo是一个常数 ......
继续往前走
const char* const foo
^
Run Code Online (Sandbox Code Playgroud)
foo是一个指向 ... 的常量指针
继续往前走
const char* const foo
^^^^
Run Code Online (Sandbox Code Playgroud)
foo是char的常量指针...
继续往前走
const char* const foo
^^^^^
Run Code Online (Sandbox Code Playgroud)
foo是char 常量的常量指针(完成!)
从标识符开始,我们不能向右走,所以我们向左走
char* const foo
^^^^^
Run Code Online (Sandbox Code Playgroud)
foo是一个常数 ......
继续往前走
char* const foo
^
Run Code Online (Sandbox Code Playgroud)
foo是一个指向 ... 的常量指针
继续往前走
char* const foo
^^^^
Run Code Online (Sandbox Code Playgroud)
foo是char的常量指针(完成!)
从标识符开始,但现在我们可以正确行事!
const char* const* (*foo[8])()
^^^
Run Code Online (Sandbox Code Playgroud)
foo是一个8的数组 ......
命中括号因此不能再向右走了,向左走
const char* const* (*foo[8])()
^
Run Code Online (Sandbox Code Playgroud)
foo是一个8 指针的数组...
在括号内完成,现在可以正确
const char* const* (*foo[8])()
^^
Run Code Online (Sandbox Code Playgroud)
foo是一个返回函数的8指针数组...
没有更多的东西,向左走
const char* const* (*foo[8])()
^
Run Code Online (Sandbox Code Playgroud)
foo是一个8指向函数的数组,返回一个指向 ... 的指针
继续往前走
const char* const* (*foo[8])()
^^^^^
Run Code Online (Sandbox Code Playgroud)
foo是一个8指向函数的数组,它返回一个指向常量的指针...
继续往前走
const char* const* (*foo[8])()
^
Run Code Online (Sandbox Code Playgroud)
foo是一个8指向函数的数组,它返回一个指向一个常量指针的指针 ...
继续往前走
const char* const* (*foo[8])()
^^^^
Run Code Online (Sandbox Code Playgroud)
foo是一个8指向函数的数组,它返回一个指向char的常量指针的指针...
继续往前走
const char* const* (*foo[8])()
^^^^^
Run Code Online (Sandbox Code Playgroud)
foo是一个8指向函数的数组,它返回一个指向char 常量的常量指针的指针(Complete!)
进一步说明:http://www.unixwiz.net/techtips/reading-cdecl.html
Tho*_*ews 12
很多人建议从右到左阅读类型说明符.
const char * // Pointer to a `char` that is constant, it can't be changed.
const char * const // A const pointer to const data.
Run Code Online (Sandbox Code Playgroud)
在两种形式中,指针指向常量或只读数据.
在第二种形式中,指针不能改变; 指针总是指向同一个地方.