dedecms 食品网站模板百度指数的搜索指数
文章目录
- 1.指针的来源
- 2.指针的定义:
- 3.字长和数据类型
- 4.Linux内核为什么常用unsigned long来替代指针?
- 参考资料
1.指针的来源
方便引用一个内存地址。
给定一个内存地址,CPU就可以取出该地址的数据。
给定一个内存地址,CPU就可以写入该地址一个值。
2.指针的定义:
指针的本质其实也是一个数据类型,和char, short, int 等一样都属于c语言中的基本类型,所以大小也确定了(与它是什么类型无关),32位系统为4个字节,64为系统为8个字节。
无论指针什么类型(大小以确定),它存放的都是一个地址,只不过这个地址存放不同数据类型而已。
指针变量与其它变量(如int)相似,也有两个方面即:值 和 类型(所指向的数据类型)
值:表示某个对象的地址(位置)。
类型:表示那个地址(位置)上所存储对象的类型。
备注:指针的强制类型转换不会改变真实的指针,只是告诉编译器以新的数据类型来看待被指向的数据。
3.字长和数据类型
在支持Linux的体系结构中,能够由机器一次完成处理的数据称之为字,指明了指针数据的 nominal size。虚拟地址是以这样的一个字来编码,所以字长决定的最重要的系统参数就是虚拟地址空间的最大大小。即:对于一个字长位n的机器,虚拟地址的范围位 0 ~ 2n-1 ,程序最多访问2n个字节。
处理器通用寄存器的大小和他的字长是相同的。long类型总是等于机器的字长,也等于指针的大小。
但是long和int 大小没办法保证一样。比如:
Linux支持的64位体系架构 long 8个字节,int 4个字节。
Linux支持的32位体系架构 long 4个字节,int 4个字节
因此不要假设 long 和 int 长度相等,也不要假设指针和int 长度相等。
备注:上面只是讨论支持Linux的体系架构
4.Linux内核为什么常用unsigned long来替代指针?
因为指针也是一种基本类型,所以大小是确定的,32位系统下为4个字节,由于地址的值不能为负,所以指针的值的范围为 0 - (2^32-1),与unsigned long大小,值的范围一样。
所以32位系统下指针的最大寻址范围为2^32-1,即4G(所以32位系统虚拟地址为0 - 4G)。
64位系统下大小为8个字节,与unsigned long大小,值的范围一样。
可见指针与unsigned long 大小,值的范围也一样。(但意义不一样,只是值一样)
小结:指针与unsigned long 大小一样,值的范围也一样。
(当linux内核只关心这个地址的值,用于去运算、查找、对比,而不是关心通过这个地址去访问内存,这个时候,内核经常用unsigned long来替代指针)。
参考资料
为什么Linux内核常常用unsigned long来代替指针
聊聊C语言和指针的本质