什么更有意义 – char *string或char *string?
可能重复:
在C中,为什么前面的variables名是星号,而不是后面的types?
我正在学习C ++,而且我遇到了很多以null结尾的string。 这让我想到了,声明指针的时候更有意义:
char* string
要么
char *string
? 对我来说,char *格式更有意义,因为“string”的types是指向char的指针,而不是char。 不过,我通常会看到后者的格式。 这也适用于引用,显然。
有人能告诉我,后者的格式是否合乎逻辑?
在下面的声明中:
char* string1, string2;
string1
是一个字符指针,但string2
只是一个单个字符。 出于这个原因,声明通常被格式化为:
char *string1, string2;
这使得它稍微清楚一点, *
适用于string1
而不适用于string2
。 好的做法是避免在一个声明中声明多个variables,特别是如果其中一些是指针的话。
Bjarne Stroustrup对此有话要说 :
当人们试图用一个声明来声明几个指针时,关键性的混淆(仅)
int* p, p1; // probable error: p1 is not an int*
从技术上讲,写出来是有道理的
char *f
因为*f
是声明符,所以char
是指定所有声明符的基本types的声明说明符。 声明符包含像()
, []
和可以被认为是修改基types的操作符,以及实际的标识符。
我使用上面的forms把*
放到标识符上,因为它强调*f
实际上是声明符,而char
是基本types。
在某种程度上,当操作符应用于标识符时,可以想象声明符中的修饰符在声明说明符中作出types。 但它并不总是工作:
int a, *b, &c = a, d(), e[1], C::*f;
请注意,除了&c
和C::*
之外,所有的a
, *b
, d()
和e[1]
静态parsing为一个int,它们声明一个引用(因此需要初始化)和一个指向类成员的指针分别。
没有人提到的是以下
char *string
也可以理解为将expression式*string
(读取:应用于指针string
的间接运算符)的types声明为char
。 从这个angular度来看,这个符号是完全合理的。
这就是说,我使用
char * string
我自己;)
(对于大多数用途,std :: string比char *更好)
我总是把*和types放在一起,就像在char *中一样,因为像Stroustrup指出的那样强调types。
而且我从来没有在一行上声明variables,以避免在这里的回答中讨论的共同问题。
char* p, q; // oops, probably not what was meant // this is mandated by our style guide: char* p; char* q;
在C ++中,将*放在types标识符(如char *)上是有意义的,因为它是types本身的一部分。
但是如果你在同一个语句中定义了多个variables,那么这个variables就会变得模棱两可,并且会让人误解
char* foo, bar;
虽然foo现在有char *types,但是bar的types是char。 所以很多人喜欢
char *foo, bar;
要清楚这一点。
在大多数情况下, std::string str
比char *
更可取。
这就是说,我通常做类似DataType * ptr
,使*
突出更好。 或者,更经常的是, std::tr1::smart_ptr<DataType> ptr
,或者可能是一个auto_ptr
。
很简单,生鱼指针在很多方面都是危险的,如果我要使用一个,我希望它能够脱颖而出。
我真的很喜欢“ char* foo
”的成语,因为它把关于variablestypes的所有信息放在一个地方。 如果“ *foo
”部分在屏幕上半部分标签,“ char *foo
”可能会相当混乱!
另一方面,我同意其他的海报,当在一行中声明多个variables时,这是令人困惑的。 在一行中声明多个variables时,我尽量不要混合types, char
和char*
在我的脑海中是不同的types,所以特定的情况并不是我的代码中可能发生的情况。
我的回答:既不,你应该使用:
char * string;
考虑一下,如果Dennis Ritchie(C语言的devise者)不是使用'*'字符而是使用关键字'ptr',那么我们都必须说:
char ptr string;
而没有这些讨论。
这也是,恕我直言,更可读。
因为你可以在一行中做多个声明,所以它对于我来说更属于variables而不是types,例如
char *pString, arrString[20];
我也认为char * foo在声明单个variables时更有意义。
我唯一使用其他格式的时候是在一行中声明多个variables,例如:
char * foo,bar;
就个人而言,我从来没有在一行中声明多个variables。
因为这一点,我真的觉得模式很好,所以我觉得这个简单模式很吸引人:
type varname
这意味着我几乎总是说int [] iArray或int * piArray(或任何匈牙利符号,我十年没有使用C ++)。
这也意味着我从来不使用int iArray [],因为它是一个数组的一部分,而不是variables名。
这样思考也帮助我简化了几次定义。
只是提供另一个POV
第一个build议(char * var)只要你只声明每行一个variables就可以,但是我个人更喜欢“char * var”。 和每行一个variables – 它可能会使行数更长的function,但非常清楚。
最后,C ++应该使用“string var”,但是我们总是以“char *”inheritance代码或者不得不连接到非C ++库。