深入理解指针(1)

       关于C语言的指针,作为C语言的精华所在,要进行学习就必须去深入理解指针,所以我们要一点一点的逐步理解吸收。

这次我先讲两个知识点:

1.内存和地址。

2.指针变量和地址操作符

1内存和地址

1.1内存

举个例子:2
       假设有⼀栋宿舍楼,把你放在楼⾥,楼上有100个房间,但是房间没有编号,你的⼀个朋友来找你玩,
       如果想找到你,就得挨个房子去找,这样效率很低,但是我们如果根据楼层和楼层的房间的情况,给
每个房间编上号:
⼀楼:101,102,103...
⼆楼:201,202,203...
三楼:301,302,303...
       有了房间号,如果你的朋友得到房间号,就可以快速的找房间,找到你。生活中,每个房间有了房间号,就能提高效率,能快速的找到房间。
我们把这个例子代入计算中,又是怎么样的呢?
在CPU处理数据的时候,数据是从内存读取的,处理后的数据也会放回内存中        
那这些内存空间如何高效的管理呢?
        其实也是把内存划分为⼀个个的内存单元,每个内存单元的大小取1个字节。
其中,每个内存单元,相当于⼀个学生宿舍,⼀个人字节空间里面能放8个
比特位,就好比同学们住的八人间,每个人是一个比特位。
       每个内存单元也都有⼀个编号(这个编号就相当于宿舍房间的门牌号),有了这个内存
单元的编号,CPU就可以快速找到⼀个内存空间。
       生活中我们把门牌号也叫地址,在计算机中我们把内存单元的编号也称为地址。在C语言中给地址起了新的名字叫:指针。
所以我们可以理解为: 内存单元的编号 == 地址 == 指针        
计算机中常⻅的单位和单位换算:

其中⼀个⽐特位可以存储⼀个2进制的位1或者0。

1.2理解编址

       CPU访问内存中的某个字节空间,必须知道这个字节空间在内存的什么位置,而因为内存中字节很多,所以需要给内存进行编址(就如同宿舍很多,需要给宿舍编号⼀样)。
        计算机中的编址,并不是把每个字节的地址记录 下来,而是通过硬件设计完成的。硬件编址也是如此
        
       首先,必须理解,计算机内是有很多的硬件单
元,而硬件单元是要互相协同工作的。
       所谓的协同,至少相互之间要能够进行数据传递。
但是硬件与硬件之间是互相独立的,那么如何通信呢?
答案很简单,用"线"连起来。
     而CPU和内存之间也是有大量的数据交互的,所
以,两者必须也用线连起来。
不过,我们今天只学习一组线,它叫地址总线。

 
       我们可以简单理解,32位机器有32根地址总线,每根线只有两态,即表示0或1【电脉冲有无】,那么一根线,就能表示2种含义,2根线就能表示4种含义,依次类推。32根地址线,就能表示2^32种含义,每⼀种含义都代表⼀个地址。地址信息被下达给内存,在内存上,就可以找到该地址对应的数据,将数据在通过数据总线传入CPU内寄存器。

2.指针变量和地址操作符

2.1取地址操作符   (&) 

理解了内存和地址的关系,我们再回到C语⾔,在C语⾔中创建变量其实就是向内存申请空间,比如:

那我们如何能得到a的地址呢?

这⾥就得学习⼀个操作符   (&)    即取地址操作符

       上述的代码就是创建了整型变量a,内存中申请4个字节,用于存放整数10,其中每个字节都有地址,上图中4个字节的地址分别是:
0x0133F974
0x0133F975
0x0133F976
0x0133F977
       按照我的例子,会打印处理:0x0133F974。
       因此可见&a取出的是a所占4个字节中地址较小的字节的地址。 虽然整型变量占用4个字节,我们只要知道了第⼀个字节地址,顺藤摸瓜访问到4个字节的数据也是可行的。

2.2解引用操作符(*)

       那我们通过取地址操作符(&)拿到的地址是⼀个数值,比如:0x0133F974,这个数值有时候也是需要存储起来,以便后期再使用,那我们把这样的地址值存放在哪里呢?答案是:指针变量中。
       我们将地址保存起来,未来是要使⽤的,那怎么使用呢?在现实生活中,我们使用地址要找到⼀个房间,在房间里可以拿去或者存放物品。C语言中其实也是⼀样的,我们只要拿到了地址(指针),就可以通过地址(指针)找到地址(指针)指向的对象,这里必须学习⼀个操作符叫解引用操作符(*)
      上面代码中就使用了解引用操作符, *p  的意思就是通过p中存放的地址,找到指向的空间,
*p其实就是a变量了;所以*p = 0,这个操作符是把a改成了0。
      那么有人肯定在想,这⾥如果目的就是把a改成0的话,写成 a = 0; 不就完了,为啥非要使用指针呢?其实这里是把a的修改交给了pa来操作,这样对a的修改,就多了⼀种的途径,写代码就会更加灵活, 学得越深就越能理解其作用。

2.3指针变量的大小

       前⾯的内容我们了解到,32位机器假设有32根地址总线,每根地址线出来的电信号转换成数字信号后是1或者0,那我们把32根地址线产⽣的2进制序列当做⼀个地址,那么⼀个地址就是32个bit位,需要4个字节才能存储。
       如果指针变量是用来存放地址的,那么指针变的大小就得是4个字节的空间才可以。同理64位机器,假设有64根地址线,⼀个地址就是64个二进制位组成的二进制序列,存储起来就需要8个字节的空间,指针变的大小就是8个字节。
结论:
32位平台下地址是32个bit位,指针变量大小是4个字节
64位平台下地址是64个bit位,指针变量大小是8个字节
注意指针变量的大小和类型是无关的,只要指针类型的变量,在相同的平台下,大小都是相同的。
这就是关于内存和地址的所有知识了,希望以上知识能对你有所帮助。
  • 22
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值