一个星号的位置会影响指针吗?

4

我注意到在C++中,指针可以使用两种不同的缩进方式声明(如果这是我要找的正确单词):

//Space followed by asterisk with variable name
char *pointer;

//Asterisk followed by space and then variable name
char* pointer;

星号的位置会影响指针吗?如果会,那么在什么情况下需要使用一种缩进方式而不是另一种呢?


1
这只是一个可读性问题。在任何位置上留空都是可选的。如果你一起声明多个变量,第二种方式会变得非常误导人:char* pointer, notApointer;就我个人而言,我强烈不喜欢一次声明多个变量,所以我更喜欢 char* pointer; - JSF
由于 char * 不是一个标记,而且 *pointer 也不是一个标记,所以它们必须都等同于这四个标记:char*pointer; - David Schwartz
4个回答

10

不,空格对指针声明没有影响,但C/C++语法中存在一个bug(实际上官方称其为特性,但我不知道有谁喜欢这种行为),这是该声明:

char* pointer, pointer2;

变量 pointer 的类型为 char*,变量 pointer2 的类型为 char。因此,许多人更喜欢将其写成

char *pointer, *pointer2;
char *pointer, not_pointer;
为了更清晰地表达,"pointerness" 是名称的一部分,而不是类型。

我冒昧修改了这个答案以减少混淆。希望我没有破坏什么。 - anatolyg
这并不是一个 bug,甚至可以说它很有用,因为它允许你这样做:int i = 10, *ptr = &i。它能够工作是因为指针是复合类型:虽然你可以在声明中拥有多个复合类型(指针、引用),但你不能拥有不同的类型。但这是否会误导人呢?是的。 - edmz

3
不,星号的位置对指针的声明没有影响。

3
只要星号位于类型之后、变量名之前,那么空格就不会产生影响:
char *pointer;

与以下代码等效:

char      *             pointer;

0
在复合类型(如指针)中,星号(类型修改符)是声明符的一部分。实际上,声明由以下内容组成:
int i = 1, *pi = &i; 
^^^ ^^^^^^^^^^^^^^^ -- list of declarators 
 `- base type   

在上面,i 是一个整数,而 pi 是一个指针。

内部:

int* p1, p2; // p1 is a pointer, while p2 is an int
int *p1, p2; // same as above

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接