二者都是正确的,因为二者在 C 和 C++中都是有效的,而且意义完全一样。就语言的定义与相关的编译器来说,我们还可以说“int*p”或者“int * p”。
在“int* p”和“int *p”之间的选择与正确或错误无关,而只关乎风格与侧重点。C侧重表达式;对声明往往比可能带来的问题考虑得更多。另一方面,C++则非常重视类型。
一个“典型的 C 程序员”写成“int *p”,并且解释说“*p 表示一个什么样的 int”以
强调语法,而且可能指出 C(与 C++)的语法来证明这种风格的正确性。是的,在语法上*
被绑定到名字p 上。
一个“典型的 C++程序员”写成“int* p”,并且解释说“p是一个指向 int 的指针类型”
以强调类型。是的,p 是一个指向 int 的指针类型。我明确地倾向于这种侧重方向,而且
认为对于学好更多的高级C++这是很重要的。
严重的混乱(仅仅)发生在当人们试图在一条声明中声明几个指针的时候:
int* p, p1; // 也许是错的:p1不是一个 int*
把*放到名字这一边,看来也不能有效地减少这种错误:
int *p, p1; // 也许是错的?
为每一个名字写一条声明最大程度地解决了问题——特别是当我们初始化变量的时候。人们
几乎不会这样写:
int* p = &i;
int p1 = p; // 错误:int用一个int*初始化了
如果他们真的这么干了,编译器也会指出。
每当事情可以有两种方法完成,有人就会迷惑。每当事情仅仅是一个风格的问题,争论就会
没完没了。为每一个指针写一条声明,而且永远都要初始化变量,这样,混乱之源就消失了。