c/c++指针感悟

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.

其实这就是幼儿时期的多义字,但由于一知半解者的故作高深,以及原始开发者语言表达的疏忽,造成了多数人对指针的恐惧感。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值