指针是C/C++语言的精髓之一,虽然功能强大,但是由于各种原因,不同的人对指针的理解不同,因此书写格式也五花八门,强迫症表示不能忍~
这里所说的“书写格式”,是指定义或声明指针的时候大家习惯的书写方式,大概常见的为以下几种:
int num = 1;
int *a = # //格式一
int * b = # //格式二
int* c = # //格式三
就结果来看,当然以上三种方式表示都是没问题的,编译器也不会报错。但是对于程序的阅读者来说,可能会造成不必要的障碍。
格式一将符号*与变量a放在一起,这个很容易使人将这种定义时初始化的行为误认为是赋值,造成以下错误联想:
*a = # <====>a = &#
很显然这是错误的,int *a = #的原意是
int * a;
a = #
之所以有格式一的书写方法,可能是因为程序员仅仅把*当做运算符导致的。
格式二将指针符号*与数据类型和变量都保持距离,这样的理解能够暗示阅读者:*符号在表示指针的时候具有双重意义。同时使得以下的书写方式更加美观对称:
char * a, * b, * c;
格式三将符号*与数据类型int放在一起,意味着把int*看做一个整体,这实际上也是编译器实际工作的方式,将int*作为一种独立的数据类型来看待,我们可以将其称作“整型指针”类型,注意这种数据类型表示“指针本身”的数据类型,而不是“指针指向的数据”的数据类型,这二者是完全不同的。同理,char*,float*也一样。个人认为,这种表示方法更符合C/C++的编程思想,更容易理解。但是,这样表示对于同一行定义多个变量亦会引起误解,比如:
char* a, b, c;
上面的写法很可能并不是我们的本意,编译器仅仅会将a定义为char*类型的变量,而b和c均为char类型,而我们本来可能是想表示为:
char* a, *b, *c;
但这样写又失去了对称美。个人建议还是拆分成多行定义,
char* a;
char* b;
char* c;
这样不仅美观,而且易读易理解。
总结:
在C/C++语言中,符号“*”具有三种意义:
1.算术运算的乘号【作为运算符】:
int a = 1;
int b = 2;
int c = a * b;
2.表示“指针数据类型”【作为数据类型的组成部分】
int num = 1;
int* a = #
3.指针运算的“取内容”【作为运算符】
int num = 2;
*a = num;
按照以上对星号*理解,个人认为对于指针的定义初始化书写方式采用格式三更能体现语言的本质,这样的代码阅读起来也会更加顺畅而不会引起误解。