C/C++ 里指针声明为什么通常不写成 int* ptr 而通常写成 int *ptr ?

int* ptr = &a;明显要比 int *ptr = &a;更符合语意吧。前者把 int* 当成一个算子作用在 ptr 上,声明 ptr 是一个…
关注者
639
被浏览
263,260

108 个回答

C 语言设计的本意并不是把「int*」作为类型声明。它的设计本意是解一个方程 [1]
int ....
让 .... 的类型是 int。也就是 *ptr 的类型是 int。从而反推出 ptr 是 int 指针。

解方程的语义,才是
int *pt, *pt2;
的写法的由来。

函数指针也是这样,
int (*func)();
最早调用是必须写成 (*func)() 的。后来变成写 func() 也可以了。但是本意是解方程,(*func)() 表达式是 int 类型。

后来 C++ 加了 & 搞乱了这个规矩。但是为了对 C 兼容很多文化还是保留下来了。

我自己还是写成 int* ptr 的。

参考

  1. ^ C Traps and Pitfalls, 2.1

希望大家不要继 tab vs space、{ 是否换行之后,再搞多两个派别。

如果要搞,可以再加多两种:

int *p;  // 1. 很多书都这样写吧
int* p;  // 2. 我好像近十年习惯这么写
int * p; // 3. 一人让一步吧
int*p;   // 4. 异类!拖出去!

.