上一篇主要讨论了c指针的本质,但并没有解释指针的类型问题,这次我们重点来讨论指针的类型与指针内存分配之间的关系。
对比以下两个指针
int *p;
char *p;
单纯从上面看这两个指针有何区别?
很多读者第一反应就是其类型不同,确实没错,但是我们现在需要从底层出发,搞清楚指针类型的意义。
其实单纯从上面来看,两个指针是没有任何区别的,其内存的大小完全相同。
但是由于指针有++和--操作,导致指针的偏移量大小到底多大,这个就需要由类型决定。 因此类型仅仅只决定指针移动时偏移的大小。
下面我们来彻底分析指针这个问题。
从程序员开始写int *p这句时,计算机仅仅为p分配了一个四字节的内存地址(假设编译器为32位),而这个内存地址中存储的数据是多少并不知道,由于其数据可能是一个随机数,因此我们强行访问p时会得到一些随机的数字,这又一步说明了指针为啥需要进行初始化,但是,我们如果查看&p时,我们可以看到这是合法的,因为我们查看的是p的地址, 即计算机为p分配的一个内存地址,如图所示:
这个可能比较好理解
我们现在开始深入,看如下:(下面代码摘自作者写的嵌入式操作系统)
typedef struct pcb_struct{ struct pcb_struct *tcbprev; //前趋指针 struct pcb_struct *tcbnext; //后继指针 uint32 tcbdlycount; //延时计数器 uint8 tcbstate; //任务状态 255为头部 254尾部 0表示阻塞态,1表示就绪态,2表示挂起态 int8 *tcbname; //任务名 fun tcbtask; //任务函数指针 uint8 *tcbstack; //人工堆栈 uint8 tcbprio; //任务优先级 ptcb *tcbhandler; //任务句柄 也叫任务id uint16 tcb_sp; //任务当前的sp指针 }ptcb;现在我们定义
ptcb *rdytab[33]; //就绪查找表 0为空闲任务我们现在思考:
rdytab[33]的内存分配结构?
部分读者会有第一反应就是内存结构当然是33个结构体的大小。 如下:
其实上面是错误的
因为之前说过,即使是结构体指针数组,其数组的元素本质上仍是指针,因此,其大小也只是一个四字节的地址单元,因此,其正确的结构如下:
那有人会有疑惑,为啥
rdytab[i]->tcbprev等等,这些为什么存在呢?
其实这个并不存在,这里单纯指rdytab[i]的内存单元中,而我们需要使用rdytab[i]->tcbprev等等
时,必须先初始化rdytab[i]的值,而这个rdytab[i]->tcbprev就是指初始化时指向内存的首地址
偏移位置,这个工作是由编译器完成的,如下图所示!
显然当我们使用rdytab[i]->tcbprev时,其地址就是分配的结构体所在的地址,而不是指针数组的地址。
未来机器视觉技术发展的趋势是什么样的
美国两大科技公司专利纠纷案再次升温
一种因受人脑功能而启发的新型人工智能
日本研发出一种薄有机太阳能电池
关于物联网业内的集成商介绍总结
底层解析C指针(二)
OX7104手持示波器的功能特点和应用场景
全球第一款8GB内存手机来了!兼顾AR与VR功能!
从粗略和细致两个维度来看汽车混动架构
!销售! VP7723B 音频分析仪 VP7723B (日本
科沃斯扫地机器人受到市场追捧,重回巅峰时刻
无线数据终端怎么使用说明及设置方法
基于FSDM0265RNB的机顶盒开关电源与检修
传中国移动将推TD深度定制手机200万部
一位台湾工程师透露,大陆从台湾挖高端IC人才很疯狂
半导体存储芯片价格飙升,DRAM、NAND涨价11%和12%
什么是示波器的死区时间
平头哥首颗SSD主控芯片镇岳510问世,将率先在阿里云数据中心部署
如何选择柔性和刚性PCB
Power Platform Copilot 重磅推出-低代码的未来从今天开始