c语言 《指针的奥妙》

     近来,又有同学问我 ,关于指针的知识,回顾两年的编程之路,不知不觉,我离c语言的道路方向也偏差了很多,其实我好久都没有碰过c语言了。但是这次回顾,我又对指针有了新的认识。

    首先 ,指针他到底是个什么东西呢?其实他并没有多么奇妙,他就是一个普通的变量,不过他里面放的是同类型的地址,哈哈,我还是举个例子吧,老是说概念也挺枯燥的。

int a,*p = &a;

    上面这一行代码,定义一个int变量,再定义一个指针变量,指针变量指向变量a的地址。这么来说够形象吧~。

对,这就是最简单的指针。然后的话,再说点概念性的东西,哈哈不要头大,就是介绍一下啦。

       大家都知道 在32位机器上(或者使用的是32位软件),指针的所占字节大小都是4个,其中包括,int* ,double*,float*,char*.....,这些基本数据类型的指针变量都是占4个字节。有些同学在这里就会有疑惑,为什么 明明double占8个字节,而double*占4个字节,4比8小,为什么还可以容纳下double的数据。你们先好好想下,想不通再看下面的解答吧。


        其实啊,有这种问题的同学啊,都忽略了一个最重要的事实,这个 指针所占字节数跟你 数据所占字节数 根本不在一个层面上。 指针说白了 就是地址。再给个比喻,指针就好比你家的门牌号,你家的面积代表数据所占的字节数,不管你家是多么大,只要我有你家门牌号,我就可以访问到你家,这个毫无疑问对吧,所以疑云是不是快要被解开啦?

        如果还没有清楚,那么我在深入一下。请看:

         首先 再问一下你们知道为什么指针就是只占四个字节吗 ?把这个搞懂了,你就会明白这个问题啦。

        在计算机内,地址总线每根有两个状态(二进制),决定着寻址范围,这个范围最大值,就是内存容量的最大值。例如在32位机器上,地址总线32位,就是2的32次方,可以寻址2的32次方个 字节(可寻址的内存容量) 约等于4gb,所以大家也大概都听过32位机器最大内存就是4gb, 因为他的寻址能力限制了你只能安装4gb的内存,再大的话是检测不到的。 好了不扯这么多啦, 一个字节是8位,32位机器上,32/8 = 4,所以两两地址之间的间隔就是4个字节。那这样的话,是不是很轻松就可以知道了指针为什么占4个字节。

        看下图,保你看懂了不会再有疑问!


    注意我红框的内容, 变量c的地址是0x0019ff34。因为上面显示的地址是16进制,所以一组二进制代表一个字节。不知道你们发现一个秘密没有!!,在指针的世界,每个字节都会有他的地址 !!!!!!,,在指针的世界,每个字节都会有他的地址 !!!!!!,在指针的世界,每个字节都会有他的地址 !!!!!!,在指针的世界,每个字节都会有他的地址 !!!!!!,在指针的世界,每个字节都会有他的地址 !!!!!!

   把这句话念10遍!!,你的大脑就会越发的清晰~~ 所谓的指针 就是只存一个变量的首字节地址 (即门牌号) 拿图上的数据说就是 c的地址就是0x0019ff34。但是这个地址只是c 变量的首个字节的地址, c变量后面的三个字节地址信息 指针是不理会的,因为指针已经知道了他的数据类型{(数据类型一般在指针声明的时候就已经告诉“指针指向的门牌号的那个家占有多大面积”eg: double *p,定义一个指针变量p,在定义的时候,编译器一旦看到double,就知道它所指的门牌号占多大面积(8个字节)了)},还知道他的门牌号。这不是就轻而易举拿到地址的值了吗?  所以 地址是地址 (指针就是地址) 数据是数据,不要把指针和地址 搞混掉了。 是不是很清晰啦~~?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值