可能重复:
In C, why is the asterisk before the variable name, rather than after the type?
我正在学习C ++,而且我遇到了很多以空字符结尾的字符串。这让我思考,在声明指针时更有意义:
char* string
或
char *string
?对我来说,char *格式更有意义,因为“string”的类型是指向char的指针,而不是char。但是,我通常会看到后一种格式。这显然适用于参考文献。
有人能告诉我后一种格式是否合乎逻辑?
答案 0 :(得分:55)
在以下声明中:
char* string1, string2;
string1
是一个字符指针,但string2
只是一个字符。因此,声明的格式通常如下:
char *string1, string2;
这使得*
适用于string1
但不适用string2
更加清晰。好的做法是避免在一个声明中声明多个变量,特别是如果它们中的一些是指针。
答案 1 :(得分:34)
Bjarne Stroustrup有something to say about this:
当人们尝试使用单个声明声明几个指针时,(仅)会出现严重的混淆:
int* p, p1; // probable error: p1 is not an int*
答案 2 :(得分:13)
从技术上讲,编写
是有意义的char *f
因为*f
是其中的声明符,而char
是声明说明符,它指定所有声明符的基本类型。声明符包含()
,[]
和&
等运算符,可以考虑修改基类型和实际标识符。
我使用上述形式将*
放入标识符,因为它强调*f
实际上是声明符,而char
是基本类型。
在某种程度上,可以考虑声明符中的修饰符,以便在将运算符应用于标识符时在声明说明符中生成类型。但它并不总是有效:
int a, *b, &c = a, d(), e[1], C::*f;
请注意a
,*b
,d()
和e[1]
的所有内容如何静态解析为int - 除&c
和C::*
之外声明一个引用(因此需要初始化)和一个指向类成员的指针。
答案 3 :(得分:8)
没有人提到的是以下
char *string
也可以被解读为将*string
的表达式(读取:应用于指针string
的间接运算符)声明为char
。从这个角度来看,符号是完全合理的。
话虽如此,我使用
char * string
我自己;)
答案 4 :(得分:6)
(对于大多数用途,std :: string优于char *。)
我总是把*和类型一起放在char *中,因为as Stroustrup noted,这强调了类型。
我从不在一行上声明变量,以避免在这里的回答中讨论的常见问题;
char* p, q; // oops, probably not what was meant
// this is mandated by our style guide:
char* p;
char* q;
答案 5 :(得分:4)
在C ++中,将*置于类型标识符(如char *)是有意义的,因为它是类型本身的一部分。
但是如果你在同一个语句中定义多个变量,那就会产生歧义和误导。
char* foo, bar;
虽然foo现在有char *类型,但bar的类型为char。因此很多人喜欢
char *foo, bar;
明确这一点。
答案 6 :(得分:3)
在大多数情况下,std::string str
比char *
更受欢迎。
话虽如此,我通常会做DataType * ptr
之类的事情,以使*
更好。或者,更常见的是std::tr1::smart_ptr<DataType> ptr
,或者auto_ptr
。
很简单,原始指针在很多方面都很危险,如果我打算使用它,我希望它能脱颖而出。
答案 7 :(得分:3)
我非常喜欢“char* foo
”这个成语,因为它将有关变量类型的所有信息放在一个地方。如果屏幕中间标有“char *foo
”部分,则“*foo
”会非常混乱!
另一方面,我同意其他海报,在一行上声明多个变量时会让人感到困惑。我尝试在一行上声明多个变量时不混合类型,char
和char*
在我的脑海中是不同的类型,因此特定情况不会出现在我的代码中。< / p>
答案 8 :(得分:3)
我的回答:两者都没有,你应该使用:
char * string;
考虑一下,如果Dennis Ritchie(C语言的设计者)使用'*'字符而不是使用关键字'ptr',我们都必须说:
char ptr string;
并没有进行这些讨论。
恕我直言,更具可读性。
答案 9 :(得分:2)
鉴于你可以在一行上做多个声明,对我来说更有意义的是它属于变量而不是类型,例如。
char *pString, arrString[20];
答案 10 :(得分:2)
我也认为在声明单个变量时char * foo更有意义。
我使用其他格式的唯一时间是在一行上声明多个变量,例如:
char * foo,bar;
答案 11 :(得分:2)
我个人从不在一行上声明多个变量。
由于这一点以及我发现模式很好的事实,我发现这个简单的模式很有吸引力:
type varname
这意味着我几乎总是说int [] iArray或int * piArray(或者匈牙利语中的符号,我十年没用过C ++)。
这也意味着我从不使用int iArray [],因为它是数组的一部分,而不是变量名。
以这种方式思考也帮助我简化了几次定义。
提供另一个POV
答案 12 :(得分:0)
第一个建议(char * var)会很好,只要你每行只声明一个变量,但就个人而言,我更喜欢“char * var;” 和每行一个变量 - 它可能会使函数的行数更长,但非常清晰。
最后,C ++应该使用“string var”,但我们总是以“char *”继承代码或者必须连接到非C ++库。