为什么指针声明中的星号特定于标识符而不是数据类型?

3
傻问题,但我试图掌握其基本机制/哲学以巩固我的理解。
int myInt; // declares a variable of type integer, named myInt. Intuitive.
int* myPtr; // declares a variable of type pointer-to-integer. Also intuitive.

int myInt2, myInt3; // two more integer variables.. yay!! This makes sense.
// so the pattern is [type] [identifier] <,more-identifiers>;

int* myInt4, myInt5; // an int pointer then an integer. Brain hurts!

1
你的大脑感到疼痛是因为你坚持使用与语言不一致的风格。 - user3386109
应该是 int *myPtr;int *myInt4, myInt5; - endolith
1
我应该指出,我已经使用C++编程相当长的时间了,最终发现了这种语言中的怪异之处。我一直将星号左对齐,因为我认为指针是类型的一部分。而且它确实是!你可以将int*传递到模板中,而int*也可以成为某个东西的类型。据我所知,唯一不适用于此规则的地方是变量声明符中,其中指针是标识符的一部分!即使在这种情况下,如果您只声明一个变量,它也是不可见的。我知道这是因为C是这样工作的,但我认为这会让人感到头痛。 - jpfx1342
3个回答

5
TL;DR - 这就是 C 语法的设计原则。
星号(*)被认为是与变量“附着”在一起的,因为它定义的是变量的类型而不是数据类型。一个对象的类型应该是对象本身的属性,所以把属性的标识符与对象(变量)关联起来是有道理的。
更明确地说,当我们说“int *p;”时,意思是,“p”是一个指向整数(int)的指针类型的变量。所以,把星号(*)附着在变量上而不是数据类型上是有意义的。

1
你期望什么样的答案?这就是C语言的工作方式。如果你不喜欢它,C++的创始人Bjarne Stroustrup同意你的看法,并建议避免在最后一行做你所做的事情。
对于C语言的制造者来说这是有道理的,同时,将*放在变量旁边而不是类型旁边也很常见,这样更不容易混淆。
int *myInt4, myInt5; // an int pointer then an integer.

如果你使用clang-format来格式化你的源代码,那么这是样式选项PointerAlignment,而你想要的选项是PAS_Right

0

int* myInt4, myInt5; // 一个整型指针和一个整数。我的脑子都疼了!

这只是一种写法,编译器会正确解释它。 理论上,你可以把 * 放在任何地方。

 Type* variable;
 Type * variable;
 Type *variable;

它可以这样读:

int* myInt4, myInt5;` // 一个 int 类型的指针变量 (myInt4) 和一个 int 类型的变量 (myInt5)。


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