C语言 - 指针初始化,星号位置

21

在哪个位置放置星号最合适?为什么?

1)    type*     var;
2)    type      *var;

20
你忘了写 type * var。请注意补充。 - pmg
1
@pmg 还有 typedef type* typePTR - ruslik
投票关闭。无论样式如何,它都将始终被解析为“type(*var);”。 - John Bode
2
重复的帖子已经消失,所以我认为这篇帖子应该重新开放...除非还有另一个完全相同的重复帖子... - chutsu
https://dev59.com/jHE85IYBdhLWcg3wl0nF - Cristik
9个回答

29

如果您只声明一个指针,则无论如何都没有关系。通常写法是第二个例子(我通常读/写的代码中),但对于编译器来说,这是相同的。

问题可能会出现在您声明多个指针时。例如,这不是声明两个指针,而是声明一个指针和一个类型为“type”的变量。

type* var1, var2;

你需要做的是:

type* var1, *var2;

我总是喜欢在变量前使用星号(*)。


8

指针是一种类型,我认为将类型信息分组是最有意义的:

int* foo;

这可能会导致混淆,特别是当多个变量在同一行被定义时:
int* foo, bar;  // foo will be int*, bar will be int

这个问题的解决方案是,永远不要在同一行声明多个变量。Code Complete 也提倡这种做法。

5

两种方式都可以。我认为#1在一般情况下更清晰易懂,但在C语言中可能会误导并引起错误,例如:

type* var1, var2;

// This actually means:

type *var1;
type var2;

我认为在C语言中, #2 更符合习惯用法,因此建议使用它,特别是当你不是唯一的程序员在编写代码时(当然,如果你们都同意一种风格,那就无所谓了)。


3

正如其他人所指出的,这两种方式都可以正常工作,而错误的一种实际上具有语法经济性的优势。

在我看来,一个声明由类型后跟 变量 组成。

<type> <variable>;

int   ii;
int* pii;

因此,如果去除变量,剩下的就是类型。这里的intint*。编译器将int*作为内部类型(即指向int的指针)处理。

不幸的是,C语言并不支持这种语法。当声明多个相同类型的变量时,你应该这样做:

<type> <variable>, <variable>, <variable>;

使用指针类型无法实现以下操作:

int* ii1, ii2, ii3;

声明ii1的类型为int*,其余变量的类型为int。为避免这种情况,我习惯于每行只声明一个变量。


2

我听说过有人认为星号(*)实际上是对变量的修饰符,这一点可以通过在多个变量声明中需要使用星号(*)来证明。

例如:int *p, *q, *r;

然而,我更喜欢将星号(*)视为基本类型的修饰符,因为它出现在函数原型中。

例如:void func(int*);

.PMCD.

PS. 我知道我没有解决你的问题 :)


1
除非我到了第80列,否则我从不在原型中写int*(无空格)。在我看来,int *(有空格)更清晰易懂。 - R.. GitHub STOP HELPING ICE

1
第二种模式是正确的。其他模式对于初学者程序员来说不太清晰。 通常不建议使用 int* 变量形式。

为什么另一种模式不够清晰? - Johan Kotlinski
当你使用int* foo, bar时,并不是每个人都明白变量bar并不是一个整数指针。 - DavideDM

1

声明语义遵循表达式语义(特别是运算符优先级),我发现使用第二种风格更容易阅读更复杂的声明。

你可以这样想

int *foo;

声明表达式*foo(即应用于foo的间接操作符)的类型为int,而不是将foo声明为int *类型。

无论您选择哪种约定,请尽量保持一致。


1

这更像是程序员的偏好。

对我而言,我声明指针的方式是:

int * var1, var2;

其中var1是一个指针,而var2不是。如果你想在同一行声明多个指针:
int * var1, * var2;

当然,使用其他方法也是有效的。


0

没有一个“最合适的位置”。

通常是代码中其余部分使用的位置。

如果你从一开始就编写自己的代码并可以选择自己的约定:选择自己的约定并坚持它。

如果你选择了除 type * var 以外的其他东西,你将会遇到“尴尬”的情况:

/* write these with another style */
int * var;
int const * var;
int * restrict var;

PS. 这并不重要,但我通常使用 type *var;


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