1,一词多义 “* ”的两个含义
指针中涉及到两个符号*(取值符),&(取地址符)。
可以把星号*,看作多义字。其不止1:包含取值的含义,还有2:定义指针的含义。
例如,int *x ;//此时我使用定义指针的这个意思。
使用
int a = 10;
int *pa = &a;//这里的*号仍然代表了“创造指针”的含义,而不代表取值含义,因为这个pa是第一次出现的,许多人简便起见,采用这种一行代码的形式完成了。
实际上
int *pa = &a;//创造指针变量与赋值(声明同时初始化)
这一行等价于
int *pa ; //声明指针pa(创造指针变量)
pa = &a;//初始化指针pa(赋值),赋值给了pa
/*先定义好了指针,然后把a的首地址赋值给指针pa,指针pa的指针值就是变量a的首地址了。*/
你注意到了二者差别,为什么&a,既可以赋值给*pa ,也可以给pa呢?,原因是第一部分代码是为了简写,同时完成声明与初始化操作,而第二行代码是分开写,就好像先声明再初始化一样。
而在已经定义好指针的情况下。
比如我们还是使用pa这个指针。
int *pa ;
int *pb,b;
pb = pa;//这样就把指针pa的指针值(a的地址),赋值给了指针pb的指针值。
b = *pa ;//由于已经定义过指针pa了,所以再出现*pa,这里的含义就改变成,“取值”,*pa的含义就是取指针pa所指向的地址空间中所存储的内容,即a的变量值10;
教科书以及官方书中都指出*是取值符,以及使用*号定义指针,但没有强调它们在一行代码完成指针定义以及赋值,两行代码分别完成指针定义、赋值,这两种方式时*符号的差别,这给学生们学习指针时带来了不易察觉的误导,造成理解上的困难。
总结,已经定义好指针的情况下,* 只有“取内容值”的作用。
int a = 5;
int *pa ; //声明指针pa(创造指针变量)
pa = &a;//初始化指针pa(赋值),将a的地址给了pa,
//*pa 等价于 a, pa 等价于 a 的地址。
而 int *pb = &a ;//pb这个指针变量是在本行创造出来并赋值的。所以才会被&a 赋值给*pb;
//此时pb等价于pa等价于a的地址,*pb等价于*pa等价于a.
其实这就是幼儿时期的多义字,但由于一知半解者的故作高深,以及原始开发者语言表达的疏忽,造成了多数人对指针的恐惧感。