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

Ski*_*ick 27 c++ string pointers

可能重复:
在C中,为什么变量名前的星号,而不是类型之后?

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

char* string
Run Code Online (Sandbox Code Playgroud)

要么

char *string
Run Code Online (Sandbox Code Playgroud)

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

有人可以告诉我,后一种格式是否有合理的原因?

Gre*_*ill 56

在以下声明中:

char* string1, string2;
Run Code Online (Sandbox Code Playgroud)

string1是一个字符指针,但string2只是一个字符.因此,声明通常格式如下:

char *string1, string2;
Run Code Online (Sandbox Code Playgroud)

这使得它*适用于string1但不是更清楚string2.好的做法是避免在一个声明中声明多个变量,特别是如果它们中的一些是指针.

  • 这是胡说八道.为什么每个人都对这个边缘案件着迷?!在决定如何对齐星号时,需要考虑更重要的因素. (8认同)
  • 恕我直言,这不应该被认为是一个很好的答案.考虑到: - 我们在谈论C++ - 类型是char* - 你传递的变量是"string",很少是"*string". - 变量必须尽可能晚地声明,因此根据定义,它不是在同一行而不是另一行. - Bjarne说:"一个典型的C++程序员写int*p ...我显然更喜欢强调并认为它对于使用C++的更高级部分很重要. - const char*const string然后char*string更有意义.为清楚起见,我甚至更喜欢char*string. (4认同)
  • 我觉得在同一行中声明不同类型的变量是不合理的. (2认同)

smo*_*smo 35

Bjarne Stroustrup有话要说:

当人们试图用单个声明声明几个指针时,(仅)会产生严重的混淆:

int* p, p1; // probable error: p1 is not an int*
Run Code Online (Sandbox Code Playgroud)

  • 如果你滚动浏览Stroustup的常见问题解答,看看他在自己的代码中实际使用了哪种指针样式很有趣. (2认同)
  • C++ 核心指南声明运算符应该与类型相邻:https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#nl18-use-c-style-declarator-layout (2认同)
  • @otto嗯,如果你真的读过他的帖子,你会发现他正在使用他所说的他喜欢的风格.这个答案有点误导,因为它隐藏了实际的上下文,重要的一点是:"*一个'典型的C++程序员'编写`int*p;`并解释它''p`是一个指向`int`'的指针,强调确实p的类型是`int*`.**我显然更喜欢强调**[...].* (2认同)
  • *阅读完整的上下文!* 这完全不正确地脱离了上下文,以与 Stroustrup 所说的*相反* 点! (2认同)

Joh*_*itb 14

从技术上讲,写作是有道理的

char *f
Run Code Online (Sandbox Code Playgroud)

因为*f是声明器,而char声明说明符是指定所有声明符的基本类型.的说明符包含像运营商(),[]并且&其可以被认为修改基本类型的,并且实际的标识符.

我使用上面*的标识符形式,因为它强调*f实际上是声明符,而是char基本类型.

在某种程度上,当运算符应用于标识符时,可以考虑声明符中的修饰符以在声明说明符中生成类型.但它并不总是奏效:

int a, *b, &c = a, d(), e[1], C::*f;
Run Code Online (Sandbox Code Playgroud)

注意如何所有的a,*b,d()e[1]静态解析为int -从开&cC::*分别声明(因此需要初始化)的引用和指向类成员.


Chr*_*oph 9

没有人提到的是以下内容

char *string
Run Code Online (Sandbox Code Playgroud)

也可以读作声明表达式的类型*string(读取:应用于指针的间接运算符string)as char.从这个角度来看,符号是完全合理的.

话虽这么说,我用

char * string
Run Code Online (Sandbox Code Playgroud)

我自己;)


Bri*_*eal 6

(对于大多数用途,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;
Run Code Online (Sandbox Code Playgroud)


rai*_*mue 5

在 C++ 中,将 * 放在类型标识符(如 char*)处是有意义的,因为它是类型本身的一部分。

但是,如果您在同一个语句中定义多个变量,这会变得含糊不清且具有误导性。

char* foo, bar;
Run Code Online (Sandbox Code Playgroud)

虽然 foo 现在具有 char* 类型,但 bar 具有 char 类型。因此很多人更喜欢

char *foo, bar;
Run Code Online (Sandbox Code Playgroud)

为了澄清这一点。