大家好,很多同学和我一样,开发过程中会使用指针,但也只是照猫画虎,具体的理解并不是完全透彻,今天为大家分享一些方法(一)
①首先了解普通变量(以整型变量为例)
int a = 10;
这里的 a 对于计算机内存,是不识别的,a 只是给人用来识别的,真正的计算机识别的是变量a的地址,众所周知,int类型变量为4字节,而每个内存单元是一个字节,这时候,我们将数值10填写到地址里,这里即4个地址(如下图每一个0x加八个数字的形式就代表一个地址),也就是说,占用4个0x加八个数字的形式的东西,就代表我们需要填的值(10)的地址。
0xFFFFFFFF |
..... |
...... |
...... |
...... |
...... |
...... |
0x00000000 |
②再了解指针变量
int a = 10;
int *pa = &a;
第二行的 * 的作用是说明pa是个指针变量,&为取地址符,我们称pa为“指针pa”
指针pa因为涉及到底层CPU总线地址等,看似高级,但可以理解为他就是int a 的附属品:
假设一下就是int a = 10的地址:
...... |
...... |
...... |
0x00001003 |
0x00001002 |
0x00001001 |
0x00001000 |
...... |
..... |
..... |
新知识点:四个地址要选出一个代表,以表示“背后的家族”,通常选十六进制最小的地址,这里即0x00001000;
所以,我们提及地址0x00001000的时候,即提及上图中,int a的由四个地址组成的地址。
这样我们就描绘一个地址,太方便了。
现在,地址0x00001000中存放的是10,类型是int,至于a,开篇提到,是给人看的,我们暂且可以忽略:
如下图1,一个方块代表了这个方块的地址0x00001000外加这个变量的值10,变量名a在下方标注一,右方是变量类型:
图1
int *pa = &a;的意思是:把a的地址(0x00001000)借用到int * 类型的pa的地址里
仔细观察下方变化,图2↓
图2
一个int *类型的 pa 指针变量偷走了a的地址!!!
不着急,再来看解引用符:*pa(观察*在不同为时候的作用,int * 中的 * 是为了生命pa是一个“指针变量”,下一行开局就 * 加一个变量的作用是,将这个指针变量解引用,然后可以赋值)
int *pa = &a;
*pa = 15;
那么,在图1中,方块里面紫色位置是给a复制,我们解引用之后,图2的下面紫色方块没有值的地方就是我们要赋值的地方,即解引用的值(*pa),我们在在代码里给*pa赋值15,这样就传递到了0x00001000的地址里,但是这个地址偷来的呀!要还回去,这样就起到了改变a的值的作用。
“偷”这个词呼应开头“是a的附属品”:
指针变量的创建是为了在某些情况下更方便地为变量a赋值,劫走的地址是要还的,而且必须还,其主体还是围绕变量a进行的,所以这样说。
有错误的地方请大佬包涵并指出,下一期,阶梯式深入理解指针(二)