在哪个位置放置星号最合适?为什么?
1) type* var;
2) type *var;
如果您只声明一个指针,则无论如何都没有关系。通常写法是第二个例子(我通常读/写的代码中),但对于编译器来说,这是相同的。
问题可能会出现在您声明多个指针时。例如,这不是声明两个指针,而是声明一个指针和一个类型为“type”的变量。
type* var1, var2;
你需要做的是:
type* var1, *var2;
我总是喜欢在变量前使用星号(*)。
指针是一种类型,我认为将类型信息分组是最有意义的:
int* foo;
int* foo, bar; // foo will be int*, bar will be int
两种方式都可以。我认为#1在一般情况下更清晰易懂,但在C语言中可能会误导并引起错误,例如:
type* var1, var2;
// This actually means:
type *var1;
type var2;
我认为在C语言中, #2 更符合习惯用法,因此建议使用它,特别是当你不是唯一的程序员在编写代码时(当然,如果你们都同意一种风格,那就无所谓了)。
正如其他人所指出的,这两种方式都可以正常工作,而错误的一种实际上具有语法经济性的优势。
在我看来,一个声明由类型后跟 变量 组成。
<type> <variable>;
int ii;
int* pii;
因此,如果去除变量,剩下的就是类型。这里的int和int*。编译器将int*作为内部类型(即指向int的指针)处理。
不幸的是,C语言并不支持这种语法。当声明多个相同类型的变量时,你应该这样做:
<type> <variable>, <variable>, <variable>;
使用指针类型无法实现以下操作:
int* ii1, ii2, ii3;
声明ii1的类型为int*,其余变量的类型为int。为避免这种情况,我习惯于每行只声明一个变量。
我听说过有人认为星号(*)实际上是对变量的修饰符,这一点可以通过在多个变量声明中需要使用星号(*)来证明。
例如:int *p, *q, *r;
然而,我更喜欢将星号(*)视为基本类型的修饰符,因为它出现在函数原型中。
例如:void func(int*);
.PMCD.
PS. 我知道我没有解决你的问题 :)
int*
(无空格)。在我看来,int *
(有空格)更清晰易懂。 - R.. GitHub STOP HELPING ICE声明语义遵循表达式语义(特别是运算符优先级),我发现使用第二种风格更容易阅读更复杂的声明。
你可以这样想
int *foo;
声明表达式*foo
(即应用于foo
的间接操作符)的类型为int
,而不是将foo
声明为int *
类型。
无论您选择哪种约定,请尽量保持一致。
这更像是程序员的偏好。
对我而言,我声明指针的方式是:
int * var1, var2;
var1
是一个指针,而var2
不是。如果你想在同一行声明多个指针:int * var1, * var2;
当然,使用其他方法也是有效的。
没有一个“最合适的位置”。
通常是代码中其余部分使用的位置。
如果你从一开始就编写自己的代码并可以选择自己的约定:选择自己的约定并坚持它。
如果你选择了除 type * var
以外的其他东西,你将会遇到“尴尬”的情况:
/* write these with another style */
int * var;
int const * var;
int * restrict var;
PS. 这并不重要,但我通常使用 type *var;
type * var
。请注意补充。 - pmgtypedef type* typePTR
。 - ruslik