在以下声明中:
char* string1, string2;
string1
是一个字符指针,但string2
只是一个字符.因此,声明通常格式如下:
char *string1, string2;
这使得它*
适用于string1
但不是更清楚string2
.好的做法是避免在一个声明中声明多个变量,特别是如果它们中的一些是指针.
在以下声明中:
char* string1, string2;
string1
是一个字符指针,但string2
只是一个字符.因此,声明通常格式如下:
char *string1, string2;
这使得它*
适用于string1
但不是更清楚string2
.好的做法是避免在一个声明中声明多个变量,特别是如果它们中的一些是指针.
Bjarne Stroustrup有话要说:
当人们试图用单个声明声明几个指针时,(仅)会产生严重的混淆:
int* p, p1; // probable error: p1 is not an int*
从技术上讲,写作是有道理的
char *f
因为*f
是声明器,而char
声明说明符是指定所有声明符的基本类型.的说明符包含像运营商()
,[]
并且&
其可以被认为修改基本类型的,并且实际的标识符.
我使用上面*
的标识符形式,因为它强调*f
实际上是声明符,而是char
基本类型.
在某种程度上,当运算符应用于标识符时,可以考虑声明符中的修饰符以在声明说明符中生成类型.但它并不总是奏效:
int a, *b, &c = a, d(), e[1], C::*f;
注意如何所有的a
,*b
,d()
和e[1]
静态解析为int -从开&c
和C::*
分别声明(因此需要初始化)的引用和指向类成员.
没有人提到的是以下内容
char *string
也可以读作声明表达式的类型*string
(读取:应用于指针的间接运算符string
)as char
.从这个角度来看,符号是完全合理的.
话虽这么说,我用
char * string
我自己;)
(对于大多数用途,std :: string优于char*.)
我总是把*和类型一起放在char*中,因为正如Stroustrup所说,这强调了类型.
我从不在一行上声明变量,以避免在这里的回答中讨论的常见问题;
char* p, q; // oops, probably not what was meant // this is mandated by our style guide: char* p; char* q;