宣告指针; 类型和名称之间的空格左侧或右侧的星号?

jak*_*gut 116 c c++ pointers

可能的重复:
什么更有意义 - char*string或char*string? C++中的指针声明:星号的放置

我已经在很多代码中看到了这个的混合版本.(顺便说一下,这适用于C和C++.)人们似乎用两种方式之一来声明指针,我不知道哪一个是正确的,如果它甚至是重要的.

第一种方法是将星号放在类型名称旁边,如下所示:

someType* somePtr;
Run Code Online (Sandbox Code Playgroud)

第二种方法是将星号放在变量名称旁边,如下所示:

someType *somePtr;
Run Code Online (Sandbox Code Playgroud)

这已经让我疯了一段时间了.是否有任何标准方法来声明指针?甚至指针是如何声明的?我之前使用过两个声明,并且我知道编译器并不关心它是哪种方式.然而,事实上,我已经看到以两种不同的方式宣告指针,这让我相信它背后有一个原因.我很好奇,如果任何一种方法在某些方面更具可读性或逻辑性,那我就错过了.

Joh*_*itb 117

没关系.现在有人会把这个问题作为一个骗局来解决,int* a如果你在同一个声明中声明多个变量int *a,而另一个人将会更好地反映代码的语法结构,那么其他人将展示如何破解方式,另一个人将展示Stroustrup喜欢int* a这样的.

很多意见,但这里没有"正确"的方式.

  • 我不确定但是,是否存在与语言语法如何创建星号解析相关的实际原因?如果我想到函数指针声明(`rt(*f)()`)和多变量声明(`t*a,*b`),我会认为星号符合**的标识符右**,类似于`const`实际上在左侧限定了标识符(除了在语句中的第一个). (2认同)
  • @ v.oddou星号不是像const这样的限定词。限定符属于类型说明符(这不是语法问题,而是语法,顺便说一句),而“ *”是声明符的一部分。也写`int * p;`可以修饰后面的用法。还是有人写“ * p”?最后一点是最重要的:有强制执行int * p变体的编码标准,但是我还没有看到需要其中一个的标准。而有关“ int * p,q;”给出错误视觉印象的论证则是非常强烈的。那么,如果有人写“ int * p,q;”,为什么还要写“ int * p,q”呢?始终如一! (2认同)

Tyl*_*nry 100

这是一个偏好的问题,有点像一场神圣的战争,就像大括号一样.

风格

someType* somePtr;
Run Code Online (Sandbox Code Playgroud)

强调指针变量的类型.它本质上是在说" somePtr指针的类型someType".

风格

someType *somePtr
Run Code Online (Sandbox Code Playgroud)

正在强调指向数据的类型.它本质上是说"指向的数据类型somePtrsomeType".

它们都意味着相同的东西,但它取决于创建指针时给定程序员的心理模型是否"聚焦",可以说是指向数据或指针变量.

把它放在中间(as someType * somePtr)试图避免承诺任何一个.

  • 我可以理解使用你的理由将空间放在两边,我仍然会避免它.使整个事物看起来太像我的乘法. (42认同)
  • 我更喜欢`someType*`,并在声明参数时始终使用它.**但是,在声明字段时,有一个很好的逻辑论证反对这种风格.因为对于不熟悉C++的人来说,声明`someType*value1,value2;`几乎肯定会被解释为`value1`和`value2`都是指针.(只有`value1`是指针.)简而言之,星号不是类型说明符本身的修饰符,但必须应用于*each*变量,因此它属于变量.不幸的是,我仍然觉得`someType*`更容易阅读.:( (19认同)
  • 我在`*`周围放了一个空格,但这不是为了避免提交.我的重点肯定是类型,但我认为它是一种类型的修饰语.类似于我们不怎么说'intconst`而是`int const`.当你在游戏中使用"const"时,"所有周围的空间"版本似乎也会更好.`int const*const p;`vs`int const*const q;`(或者也许是人们更喜欢的最小空格`int const*const r;`?) (13认同)

Bri*_*ndy 51

没关系,这是个人喜好.

有些人喜欢将类型保持在一起:

int* p;
Run Code Online (Sandbox Code Playgroud)

其他人说它应该在变量旁边,因为以下内容:

int *p, x;//declare 1 int pointer and 1 int
int *p, *x;//declare 2 int pointers.
Run Code Online (Sandbox Code Playgroud)

随着时间的推移,你会忽略这一点并接受两种变化.

  • 是的,这是帮助我选择`int*p`而不是`int*p`的情况.对我来说,这意味着星号与标识符有关系. (4认同)

Lan*_*uck 22

差异的产生是因为C++在C之上增加了一个更强大的类型系统.AC程序员通常用"值"来思考

int  *pValue;
Run Code Online (Sandbox Code Playgroud)

读取"pValue的取消引用是一个int",而C++程序员则在"类型"中思考

int* pValue;
Run Code Online (Sandbox Code Playgroud)

读取"类型pValue是指向int的指针"编译器当然看不到任何区别.但是你会发现在C++编程时,C程序员坚持使用"价值语义".


dte*_*eoh 18

我认为将星号放在变量名称旁边是更清楚的.

您可能会错误地声明someType* one, two;它们都是指针,但只有变量one是指针; two只是一个someType.声明为someType *one, *two避免这个问题.

  • @mrt如果类型是具有成员的类型,则您的参数仅为true; 如果类型是像`int`或float这样的标量,则没有要调用的成员. (6认同)
  • @ShammelLee是的,你有一个点!当我发表评论时,没想过简单的类型. (5认同)