可能重复:
Declaring pointers; asterisk on the left or right of the space between the type and name?
Does it matter where I place the asterisk when declaring pointers in C++?
我搜索了,但我的关键字似乎不合适。我很确定这个问题已经被问过了。如果你知道某个链接或其他什么,请指点我的方向!
我的问题是,为什么这么多人使用
TypeIdentifier *varname;
而不是
TypeIdentifier* varname;
这对我来说更合乎逻辑,因为*
修改了类型而不是变量名。
答案 0 :(得分:3)
在C和C ++中,声明语法(主要是)遵循用法。
声明
int *n;
可以理解为“n
类型为int*
”,或“*n
类型为int
”。如果你看一下语言语法,后者更接近于解析它的方式。
对于仅包含名称(如int
)和*
的类型,它不会产生很大的差别,但它对于更复杂的声明很重要。
通常的趋势是在C中使用int *n;
,在C ++中使用int* n;
。后者是因为这是Stroustrup的个人偏好。我认为,他的观点是“n
属于int*
类型”阅读更自然,并且可以通过不编写复杂的声明来避免复杂性。例如,无论您喜欢哪种间距,最好写
int *a;
int b;
比
int* a, b;
或
int *a, b;
答案 1 :(得分:1)
嗯,语言的语法另有说法。您可以通过
轻松查看Type * var1, var2;
这里会发生什么?
答案 2 :(得分:1)
这是因为C的声明语法。
int* a, b;
看起来好像定义了int*
类型的两个变量,但实际上将a
声明为类型int*
而将b
声明为类型int
。如果你写
int *a, b;
这是显而易见的。我个人更喜欢不写这样的定义,而是写
int* a;
int b;
毫不怀疑这些类型。
答案 3 :(得分:1)
C约定是将*
附加到变量,因为一行中的多个变量不共享*
:
int *a, b; /* a is an int*, while b is an int. */
在C ++中,规则是相同的,但由于上述声明的混淆性,以及随后每个声明只声明一个变量的做法,将wart附加到类型更常见:
int* a;
int b;
我倾向于C ++约定,但也允许在一行上有多个非指针或引用声明:
int a, b;
int* c;
int* d;
答案 4 :(得分:0)
因为K& R使用Foo *bar
并且人们坚持使用它。