指针变量的定义和初始化
C语言之所以是面向底层开发的低级语言,就是因为经常和内存打交道
指针说白了就是地址
比如变量a存放的地址0x406044
这个地址就叫指针
0x406044看起来很复杂,但实际上它也是个数值,只不过是十六进制的
既然你是个数值,那我就能用变量保存啊
于是我们如果把这个地址保存到变量b里
那么变量b就被称为指针变量
简单来说,保存了地址值,也就是保存了指针,那么理所当然叫做指针变量
就像我们把保存了整型数值的变量叫做整型变量一样
那如何用代码描述指针变量呢?
我们已经学习过,&a是取出变量a的地址,然后将其赋值给变量b
这里的 int* 依旧是一种数据类型,它表示指针变量存放着整型的数值
如果依然觉得抽象,可以这样理解
你住在某个房间,房间就是内存单元,你就是里面存放的数据,门牌号就是房间的地址
通过你的门牌号就可以找到你,你的朋友知道你的地址,只要有人问你朋友关于你的地址,就一定可以通过他来找到你,相当于你的朋友那里存放了你的地址(指针)
上面就是指针的定义和初始化,如果不对指针进行初始化,那么编译器不知道它应该存放哪一块内存单元的地址,所以最好养成初始化的好习惯。
*解引用
引用其实就是地址
* 和 & 实际上是一组相反操作性质的符号
&是取地址,而*是取出地址所存放的数据
因此,对于上面的指针变量b,如何取出指针变量b存放的数值呢
使用*即可取出指针变量b所保存的地址处存放的数值0
注意如果想打印指针变量b存放的地址,则用%p打印
提升一点理解,套娃行为
int a = 1;
int* b = &a;
int** c = &b;
这里c就被称为指向指针变量的指针变量,简称为指向指针的指针
理一下:变量a存放数据1,指针变量存放变量a的地址,指针变量c存放了指针变量b的地址
所以要解c的引用应该:**c
通俗理解:
问C关于A在哪里得知要先去问B,去B那里得知A在哪里,最后去A处找到A
指针的类型
并不只是int*型,也可以是char*,float*等等
取决于指针处的数据类型是什么
指针类型的大小
指针类型的大小并不是各自保存的数据类型的大小
因为指针类型实际上是地址,32位的电脑实际上是4字节,那么表示一个地址则是4字节大小
那么sizeof(int*)、sizeod(double*)......的大小都是4字节
64位的同理都应该是8字节