在指针篇(1)当中, 提到了指针定义的两种风格:「 int *p 」和「 int* p 」。 这篇博文就来说说为什么会有两种风格的指针定义。 首先需要说明的是这两种风格的指针定义在语法上完全正确, 任何的 C 语言编译器都承认这两种定义方式, 甚至你以写成:「 int * p 」, 但是这种写法是完全不推荐的。
既然编译器不区分上述两种风格的定义方法,那么这两种写法究竟有什么区别?我们知道 C 语言定义一个变量是通过「数据类型 + 变量名」的方式。 譬如:「 int a 」,其中「 int 」是数据类型,「 a 」是变量名。 我们延伸到指针就明白了,「 int *p 」将 「 int 」当成了数据类型, 「 *p 」则作为一个整体被认为是指针变量。 即定义了一个指针变量「 *p 」, 该指针的数据类型是「 int 」; 对于「 int* p 」来说,「 int* 」作为一个整体被认为是数据类型,而「 p 」则被认为是指针变量。
这两种风格的写法哪种更好? 其实网上各有各的说法, 就本人而言, 我更支持前者这种写法, 原因之一就是我学 C 语言入门的时候使用的《C 语言入门经典》(Ivor Horton 著)就是这种写法, 习惯使然。 另外一个原因主要是以下这个例子:
int *pa, pb;
int* pa, pb;
pa 是指针变量, 这没有疑问, 那么 pb 呢? 通过编译发现, 编译器认为 pa 是一个指针变量, 而 pb 则是一个一般变量。也就是说编译器并不认为「 int* 」是一个整体。 这时候, 第一种写法就显示出优势来了, 这里的「*」仅仅作为一个修饰符, 表示后面的 pa 是一个指针变量。
那么是不是第一种说法就更好呢? 其实不然, 恰恰相反, 我虽然支持第一种写法, 因为它更加一目了然, 我可以知道有变量名前面带着「*」的就是指针变量, 反之则不是。 但是我更支持将「 int* 」作为一个整体, 表示数据类型。 这对于我们理解指针是有帮助的,如果还使用第一种说法, 你会发现面对一些复杂的指针的时候你无法理解。 比如: 二重指针、 数组指针、 函数指针等。 这些东西会在下篇博文中提到, 这也是很常见的笔试题。 你完全理解了的话, C 语言的精髓你就懂了一大半了。
2017 年 7 月 8 日
Kilento