什么更有意义 – 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; 

请注意,除了&cC::*之外,所有的a*bd()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 strchar *更可取。

这就是说,我通常做类似DataType * ptr ,使*突出更好。 或者,更经常的是, std::tr1::smart_ptr<DataType> ptr ,或者可能是一个auto_ptr

很简单,生鱼指针在很多方面都是危险的,如果我要使用一个,我希望它能够脱颖而出。

我真的很喜欢“ char* foo ”的成语,因为它把关于variablestypes的所有信息放在一个地方。 如果“ *foo ”部分在屏幕上半部分标签,“ char *foo ”可能会相当混乱!

另一方面,我同意其他的海报,当在一行中声明多个variables时,这是令人困惑的。 在一行中声明多个variables时,我尽量不要混合types, charchar*在我的脑海中是不同的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 ++库。