声明指针;类型和名称之间空格的左侧或右侧的星号?[复制]

Declaring pointers; asterisk on the left or right of the space between the type and name? [duplicate]

提问人:jakogut 提问时间:4/18/2010 最后编辑:Communityjakogut 更新时间:4/27/2022 访问量:95795

问:

这个问题在这里已经有答案了:
13年前关闭。

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

我在很多代码中都看到了这个的混合版本。(顺便说一下,这适用于 C 和 C++。人们似乎以两种方式之一声明指针,我不知道哪一种是正确的,也不知道它是否重要。

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

someType* somePtr;

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

someType *somePtr;

一段时间以来,这一直让我发疯。是否有任何标准方法来声明指针?如何声明指针重要吗?我以前使用过这两种声明,我知道编译器不在乎它是哪种方式。但是,我看到以两种不同方式声明的指针这一事实使我相信这背后是有原因的。我很好奇这两种方法是否在某种程度上更具可读性或逻辑性,这是我所缺少的。

C++ C 指针

评论

3赞 N 1.1 4/18/2010
美是内在的,是外在的。美化代码执行。
0赞 dmckee --- ex-moderator kitten 4/18/2010
之前做过几次。至少看到 stackoverflow.com/questions/855566/... stackoverflow.com/questions/398395/...... stackoverflow.com/questions/558474/......
16赞 dmckee --- ex-moderator kitten 4/18/2010
可以肯定的是,这不是一个容易搜索的话题......
3赞 caf 4/18/2010
一大堆旧问题的第 N 个副本,比如 stackoverflow.com/questions/377164/......
9赞 dmckee --- ex-moderator kitten 4/18/2010
@GenTiradentes 不要担心询问重复是否是出于善意。我们关闭它们是为了试图将收集到的答案保存在一个地方,而不是作为某种惩罚。

答:

71赞 Brian R. Bondy 4/18/2010 #1

没关系,这是个人喜好。

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

int* p;

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

int *p, x;//declare 1 int pointer and 1 int
int *p, *x;//declare 2 int pointers.

随着时间的流逝,您将忽略这一点并接受这两种变化。

评论

11赞 Shammel Lee 11/12/2017
是的,这是帮助我选择的情况.对我来说,这意味着星号与标识符有关系。int *pint* p
0赞 Driss Zouak 4/18/2010 #2

我见过的每一种方式都是

TheType *myPointer

因为您正在声明 TheType 类型的 POINTER。类似声明

TheType myVar

将声明 TheType 类型的实例变量。

此外,您可以清楚地执行此操作并使其易于阅读

TheType myVar, *myPointer;

评论

7赞 Edwin Buck 10/17/2014
我也是这样看的;然而,我从来不喜欢经常重复的理由。在我看来,指针是一种类型,因此它与类型的其余部分一起使用,就像 const 修饰符一样。括号中的类型 “(const char*) var” 比 “(const char *)var” 稍微好一点。此外,大多数解释在一个或另一个领域都分崩离析。声明倾向于将星号放在变量名称旁边,但强制转换倾向于将星号放在类型名称旁边(如果您是为了便于阅读而编写的。这是 C 语言的编程语言不一致之处之一。
151赞 Tyler McHenry 4/18/2010 #3

这是一个偏好问题,有点像圣战,就像大括号一样。

“C++”风格

someType* somePtr;

强调指针变量的类型。从本质上讲,它是在说“的类型是指向的”。somePtrsomeType

“C”型

someType *somePtr;

强调指向数据的类型。从本质上讲,它是在说“所指向的数据类型是”。somePtrsomeType

它们的意思是一样的,但这取决于给定程序员在创建指针时的心智模型是“聚焦”的,可以说是指向的数据还是指针变量。

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

评论

18赞 David Stone 10/19/2013
我在 周围放了一个空格,但这并不是为了避免提交。我的重点肯定是类型,但我将其视为类型的修饰符。类似于我们不说但是.当你玩的时候,“周围的空间”版本似乎也读得更好。 vs(或者也许是人们更喜欢的最小空间?*intconstint constconstint const * const p;int const* const q;int const*const r;
74赞 Edwin Buck 10/17/2014
我可以理解用你的理由把空间放在两边,但我仍然会避免它。让整个事情在我看来太像乘法了。
1赞 Dwayne Robinson 12/18/2015
除了变量声明之外,同样的争论也适用于类型定义,即指针在逻辑上是否属于类型或被定义的东西......(a) (b) 但是,当通过“using”编写 typedef 时,星号在 typedef 中属于哪个词会变得更加清晰,因为第一个有效,而第二个是不可编译的废话。(一)(二)typedef Cat *CatPointer;typedef Cat* CatPointer;using CatPointer = Cat*;using *CatPointer = Cat;
50赞 AnorZaken 7/30/2016
我确实更喜欢 ,并且在声明参数时总是使用它。但是,在声明字段时,有一个很好的逻辑论据反对这种样式。因为对于不习惯C++的人来说,声明几乎肯定会被解释为两者兼而有之。(仅是一个指针。简而言之,星号不是类型说明符本身的修饰符,而是必须应用于每个变量,因此它属于变量。不幸的是,我仍然发现更容易阅读。:(someType*someType* value1, value2;value1value2value1someType*
1赞 konsolebox 8/13/2016
the type of data pointed to by somePtr is someType-> 那你会怎么读?注意 是 的修饰符,而不是变量。你不能说“常量变量 somePtr 指向的数据类型是 someType”。你的模棱两可就在那里。“somePtr 的类型是指向 someType 的常量指针”是唯一一致的。说“变量 somePtr 不断指向的数据类型是 someType”也已经有点偏离了。它不再是关于将参数声明为常量。someType * const somePtrconst*
134赞 Johannes Schaub - litb 4/18/2010 #4

这不重要。现在有人会过来把问题当作一个骗子来结束,其他人会展示如果你在相同的声明中声明多个变量,同时更好地反映代码的语法结构,那么方式是如何中断的,另一个人会展示 Stroustrup 更喜欢这种方式,并将类型放在左侧。int* aint *aint* a

很多意见,但这里没有“正确”的方式。

评论

5赞 v.oddou 2/25/2016
我不确定,但是与语言语法如何创建星号解析相关的实际语用原因吗?如果我想到函数指针声明 () 和多变量声明 (),我就倾向于相信星号限定了其右侧的标识符,类似于 like 实际上限定了其左侧的标识符(除非在语句中的第一个)。rt (*f) ()t *a, *bconst
0赞 Johannes Schaub - litb 2/25/2016
@v.odd 这个论点就是我总结为“int *a way better reflect the syntactical structure”:)然而,编写好代码的目的不是以某种方式模仿标准中使用的语法。首先,代码应该有效并且是可维护的,你可以争辩说。
1赞 v.oddou 2/26/2016
同意。但是,当它变得有点做作时,了解记住如何写东西的规则会有所帮助。此外,中间还有星号学派,他们声称这是有道理的,因为 const 也没有写在标识符上。 或者他们选择:空间无处不在,这样就没有优惠待遇。type * vartype const*const v;type const* const v;type const *const v;type const * const v;
2赞 too honest for this site 1/10/2017
@v.oddou 星号不是像 那样的限定词。限定符属于类型说明符(顺便说一句,这不是语法问题,而是语法问题),而 是声明符的一部分。写作也类似于后来的用法。还是有人写?最后并非最不重要的一点是:有强制执行变体的编码标准,但我还没有看到一个需要其他标准之一的编码标准。关于给人错误的视觉印象的论点是相当强烈的。那么,如果一个人写,为什么要写呢?始终如一!const*int *p;* pint *pint* p, q;int *p, q;int* p;
1赞 Z boson 3/23/2017
我确信这比但后来我有一个功能但不起作用更好。int *aint* aint* restrict aint restrict *a
25赞 dteoh 4/18/2010 #5

我认为将星号放在变量名称旁边更清晰。

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

评论

1赞 Andreas 10/20/2017
好的,但是当你第一次输入时,你会立即看到你在任何现代IDE中犯的错误,所以这真的没什么大不了的。two->doSomething()
8赞 Shammel Lee 11/12/2017
@mrt,只有当类型是具有成员的类型时,您的参数才成立;如果类型是标量 like 或 float,则没有要调用的成员。int
6赞 Andreas 11/13/2017
@ShammelLee 是的,你有一分!当我发表此评论时,还没有考虑过简单的类型。
36赞 Lance Diduck 4/18/2010 #6

之所以出现这种差异,是因为C++在C之上添加了一个更强大的类型系统


C型

C 程序员通常从“价值观”的角度来思考,因此

int  *pValue;

读作“pValue 的取消引用是一个 int”。

C++ 样式

而 C++ 程序员在“类型”中思考

int* pValue;

读取“pValue 的类型指向 int 的指针”。


当然,编译器根本看不出有什么区别。然而,你会发现,在C++编程时,坚持“值语义”的是C程序员。

评论

1赞 underscore_d 6/5/2017
只有这个狭隘的、非常规的“价值语义”定义。对于常见的定义,即在可能/实际的情况下,返回和传递值是首选,那么这绝对是 C++ 的事情。C++ 逐步添加了许多功能来促进按值语义,而 C 除了 as-if 规则之外没有任何功能,这往往会鼓励人们传递指针。