什么更有意义 - char * string或char * string?

时间:2009-02-17 19:58:24

标签: c++ string pointers

  

可能重复:
  In C, why is the asterisk before the variable name, rather than after the type?

我正在学习C ++,而且我遇到了很多以空字符结尾的字符串。这让我思考,在声明指针时更有意义:

char* string

char *string

?对我来说,char *格式更有意义,因为“string”的类型是指向char的指针,而不是char。但是,我通常会看到后一种格式。这显然适用于参考文献。

有人能告诉我后一种格式是否合乎逻辑?

13 个答案:

答案 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*bd()e[1]的所有内容如何静态解析为int - 除&cC::*之外声明一个引用(因此需要初始化)和一个指向类成员的指针。

答案 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 strchar *更受欢迎。

话虽如此,我通常会做DataType * ptr之类的事情,以使*更好。或者,更常见的是std::tr1::smart_ptr<DataType> ptr,或者auto_ptr

很简单,原始指针在很多方面都很危险,如果我打算使用它,我希望它能脱颖而出。

答案 7 :(得分:3)

我非常喜欢“char* foo”这个成语,因为它将有关变量类型的所有信息放在一个地方。如果屏幕中间标有“char *foo”部分,则“*foo”会非常混乱!

另一方面,我同意其他海报,在一行上声明多个变量时会让人感到困惑。我尝试在一行上声明多个变量时不混合类型,charchar*在我的脑海中是不同的类型,因此特定情况不会出现在我的代码中。< / 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 ++库。