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

时间:2010-04-18 00:37:38

标签: c++ c pointers

  

可能重复:
  What makes more sense - char* string or char *string?   Pointer declarations in C++: placement of the asterisk
  

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

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

someType* somePtr;

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

someType *somePtr;

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

6 个答案:

答案 0 :(得分:109)

没关系。如果你在同一个声明中声明多个变量,而int* a方式更好地反映了int *a方式的语法结构,那么现在有人会出现并将问题视为一个骗局。代码,另一个人会表明Stroustrup更喜欢int* a方式。

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

答案 1 :(得分:93)

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

风格

someType* somePtr;

强调指针变量的类型。它本质上是说“somePtr的类型是指针 - someType”。

风格

someType *somePtr

强调指向数据的类型。它基本上是说“somePtr指向的数据类型是someType”。

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

将它放在中间(如someType * somePtr)是试图避免提交任何一个。

答案 2 :(得分:51)

没关系,这是个人偏好。

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

int* p;

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

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

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

答案 3 :(得分:22)

差异的产生是因为C ++在C之上添加了一个更强大的类型系统.C程序员通常用“值”来思考,所以

int  *pValue;

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

int* pValue;

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

答案 4 :(得分:17)

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

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

答案 5 :(得分:-4)

我见过的每一种方式都是

TheType *myPointer

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

TheType myVar

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

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

TheType myVar, *myPointer;