指针(1)

一.指针是地址

1.指针是c语言中有点难理解的知识,原因是其丰富多样的指针类型(如函数指针,数组指针,单一变量的指针),不过只要搞清楚指针的本质,万变不离其宗,学懂指针还是没问题的。

要理解指针,我们需要知道,计算机的数据都是储存在内存当中,就好像我们生活的地球一样,我们住在不同的地区中,每个具体的地区都需要一个地址来形容,这样才可以方便地通过地址去找到一个人。指针就是海量计算机数据里面的地址。

2.计算机中把空间划分为一个个内存单位,每个内存单位为1个字节,每个字节都有一个编号,也即是内存单位的地址,换个说法,也就是指针。我们可以这么说:编号=地址=指针

二.简单的取地址操作

1.既然说数据的内存可以编号,那是如何操作呢?又用什么用。别急,我举一个小小的例子,让你感受一下;

与传统的  变量类型+变量名  相同,指针变量也是如此   int*  表示变量类型,p表示变量名,当然初始化需要一个地址也即是&a;

打印出来的结果是一个8位16进制的数字,这是在x86环境下运行的,一位16进制数字由4位二进制数字组成,也即是一个地址由4*8=32个二进制数字构成,一共是32个比特位,也就是4个字节;

值得注意的是,指针变量的内存大小与IDE有关,在x64环境下,指针变量占8个字节,而在x86环境下,指针变量占4个字节

2.当我们将一个int类型的数据存入地址时,也许我们会疑惑,int类型占4个字节,然而地址是按字节来编号的,那当我们打印a的地址时,这地址究竟是哪个字节的地址呢?

这个问题其实不难想明白,当然是低地址处字节的地址,我们都知道,只要找到了最低处地址,顺藤摸瓜,也就可以找到高地址处字节的地址。如果不理解的话,我们可以类比一下生活,找到一个人并不需要知道那个人住在哪个具体的房间,只要知道那个人住在哪栋房子也就好了。

三.指针类型

1.上面我们提到了将一个int类型的变量取地址时,指针变量类型是int*,那你们有没有想过,为什么*前面要是int,而不是char double 等其他类型。我想大家都应该很聪明地想到了,因为要取地址的变量是int类型!

没错,*前面的类型与要取地址的变量类型有关;举几个例子大家应该就懂

以此类推大家应该也就明白了

2.说那么多,带大家看看指针究竟有什么用吧!通过指针可以改变变量的内容;

在指针变量p前面加上*1的作用是解引用,意为通过变量a的地址找到变量a。解引用之后,我们就可以修改a的内容了,这里把a改为10;

3.也许有人不明白了,指针类型不管是int*  char*  还是其他,他的指针变量都只能存储一个字节的地址,那么给指针区分类型的意义究竟是什么?为什么不可以让指针类型统一为只有*就可以?

黑格尔说过,存在即合理。一切缘起必有因,让我来给你解释解释;

首先,指针的类型决定了,对指针解引用时有多大的权限,一次可以操作几个字节内容;我知道也许你很懵,还是举个例子吧;

这里将a和b取同样的16进制数字的值,我们知道,16进制下每2位数字占1个字节。如果将a和b的地址存入不同类型的指针,a存入int*类型的指针变量p1,b则存入char*类型的指针变量p2

仔细看看,通过解引用修改值,同样的修改位0;为什么a成功改为0,而b却只改变了最后面两位44为0?

仔细分析,44恰好占一个字节,而这一个字节被改为0;char类型占1个字节。这下你大概懂了吧。如果是int的话,int占4个字节,恰好可以将a所有的字节改变为0;

其次,指针类型的意义还不仅仅与上面所提,还关乎指针变量+-常数跳过的字节距离多大

什么?指针还可以加减?没错,不过也仅限于加减一个常数,可万不可想象力丰富以为乘除也行。

这里还是举例子吧;

通过加1;

a的地址是int*类型的,差了4个字节

b的地址是char*类型的,差了1个字节

好了,今天就先写到这里吧,最近才开始写博客,在帮助自己内化的同时,希望可以帮助到更多的正在学习计算机的你和我,我知道,这个东西好难好难,但是仔细想想,仿佛没有什么东西是简单的啊,简单的东西意味着没有价值,所以难的东西才需要我们坚持去做下去,这才是最有价值的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值