可能是最白话的C语言指针介绍

背景:我对C语言的指针一直掌握的不好,最近产生了顿悟的刚觉,所以记录下午对C指针的理解。


1. 困惑已久的符号

char cVar = 0; 表示声明了一个变量,这个比变量取名为cVar,cVar的类型是char。

char *pcVar = &cVar; 表示声明了一个变量pcVar,变量名是pcVar, pcVar的类型是char *。

char **ppcVar = &pcVar;表示声明了一个变量ppcVar,变量名是ppcVar, ppcVar的类型是char **。


从而抽象出一个公式: 变量类型   变量名  =  变量取值。


char是基本数据类型,char*表示char类型的一级指针,char**表示char类型的二级指针。而char*变量的变量取值是一个整形也就是int,是一个地址。同样char **的变量值也是一个地址。


这里简单说一下数据在机器里的存储方式。我们写出程序的最终目的是让机器按照我们的需求做出一些动作,也就是我们的程序实际上就是直到机器执行的指令,而代码只是指令的可读形式,机器所能识别的只有01码,实际上就是高低电平。显然代码里的数据是要存储进机器,那么数据在机器中存储形式必然是01码。C语言已经为我们封装了中间过程,至于我们的变量是如何变成的01码这个可以暂时不管。重要的是要知道,数据基本类型所以对应的bit和byte数。


对于基本数据类型来数,以byte为基本单位。声明了变量类型就是告诉机器,我要存一个数据,这个数据的存取单位就是这个类型对应的byte。以char为例,我声明了一个char,那么机器给我开辟了1byte的空间,我使用这个变量的时候,机器就会取1byte给我。而我声明了一个int类型变量,那么机器会给我开辟4byte的空间,我使用这个变量的时候机器就会取4byte给我,是准确的4byte不是3也不是5。 这里就可以引出强制转换类型:我把一个int赋值给char,因为这个变量类型是char,当我使用这个变量的时候,会取出1byte,虽然可能会产生数值错误,但是不会访问到未知内存。而反过来,自然会访问到当前涉及变量之外的内存。


有了上面的铺垫,就可以很顺利的说明指针了。指针也分类型,根据指针不同类型我们取数据时访问的byte数是不同的,这点应该不难理解。指针实际上就是地址的数值,地址就是内存中以byte为单位的对内存单元的索引。打个比方来说,整块内存是一栋大楼,每个byte作为一户,每一户都有唯一的门牌号,那么这个门牌号就是地址。指针这个变量里存放的就是“门牌号”。对于几个G的内存来说,这个门牌号是很大的,我们不可能去记住每个门牌号赋值个指针,但是我们可以通过“问”变量他所在门牌号是多少,实现方式就是:& var。&就是取地址符号,通过&作用于变量就等于是取到这个变量的地址。相对的,我们知道了门牌号,用*pVar,就可以取出对应单元的变量值。


对指针进行加减操作就是在改变门牌号的值,当门牌号改变了之后,我们依然可以取出对应门牌号的值,只是不同门牌号的值往往不同而已。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值