C语言之旅(1)指针

指针是什么?

指针是变量。

指针是干什么用的?

指针是存储地址的。

指针占多少个字节?

对于32位系统来说是4个字节,对于64位系统来说是8个字节,当前大多数用的还是32位系统。这里面说的系统不是计算机的操作系统,而是计算机架构的寻址能力。

对于32位系统来说计算机的地址用8位16进制数表示。因为一位16进制数相当于4位2进制数字,32=4*8。

指针的类型是什么?

例如:int *p;指针的类型就是int *;    char * p;指针的类型就是char *;所以指针的类型就是你去掉变量p剩下的部分就是指针的类型。

在这里面前面的int的意思是指针存储的地址对应的内存里面存储的变量是int类型的。占4个字节(对于32位寻址系统来说)。

下面上代码说话:

=============================================================================================================================

大家有可能一级指针二级指针一直到N级指针分不清,下面我添加了一些内容,让大家很好理解。如下图:

首先我说一下,计算机内存里面存储的都是数据,用汇编的思想理解的话,就是sp指向的地方CPU认为是指令;SS指向的地方,CPU认为是栈;ds指向的地方认为是数据。仅此而已,其实本质上他们都是二进制数字。更本质的是高低电位。在这里就不多说了。上图中,我画了三个部分,(1)二级指针 **p;(2)一级指针*p;(3)数据段中的数据存储区域。为什么我的指针没有说明存储数据类型,先别着急,往下看。上面我说了,指针就是存储地址的变量,对于32位寻址系统,存储地址需要4个字节(4*8=32)。在计算机中,每个字节 的存储空间有且只有一个地址标识。那么上图中存储2A这个数字的字节空间的地址就是0x5F3B4C,所以说对于一级指针的话,当我们得到0x5F3B4C这个地址标识的时候就可访问存储2A的字节空间了,这个时候计算机会看这个指针存储地址的对应的空间存储的数据类型,如果是cha *p;那么根据编译器的算法,会把2A返回;如果是int *p;那么以0x5F3B4C这个地址为基础,再次往后查3个字节。也就是把这四个字节的数据返回,即是5F4B3C2A。大家知道,*号的作用有两个:1:声明指针;2:引用。

当有2级指针**p的时候,那么我们先去掉一个*号表示我们使用了这个引用的功能(使用一个就去掉一个*号),这样的就剩下了*p。不用管前面的类型,当计算机看到**p的时候就知道他要要返回一个指针类型的数据,那么很明显,指针占四个字节,所以计算机会把0x4CBF2301这个数据返回给你,然而个8位的16进制数字又是(2)中21这个字节空间的地址,这个时候计算机又去掉了一个*号,他也只到是一个地址,所以就会以21这个字节的地址为基础去除4个自己的数字,也就是0x5F3B4C,然后计算机看到剩下的是一个p了。他就知道,我下面要去的是终极数据了,不再是地址了,那么要去多少个自己的数据呢?他只能去问前面的类型了,当前面的类型是int(int **p;)的时候,计算机就会返回4个字节的数字,就是5F4B3C2A;当前面的类型是char(char **p;)的时候,计算机就会返回1个字节的数字,就是2A;那么对于3级指针,4级指针,一直到N级指针,原理是一样的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值