底层解析C指针(二)

上一篇主要讨论了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时,其地址就是分配的结构体所在的地址,而不是指针数组的地址。


 

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;

原文地址:https://www.cnblogs.com/listenscience/p/12096882.html

时间: 2024-08-05 22:38:12

底层解析C指针(二)的相关文章

浅谈C中的数组和指针(二)

原文转载地址:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242419.html 在原文基础上增加自己的理解作为修改 浅谈C/C++中的指针和数组(二) 前面已经讨论了指针和数组的一些区别,然而在某些情况下,指针和数组是等同的,下面讨论一下什么时候指针和数组是相同的. C语言标准对此作了说明: 规则1:表达式中的数组名被编译器当做一个指向该数组第一个元素的指针: 注:下面几种情况例外 1)数组名作为sizeof的操作数 2)使用&

YYModel底层解析- Runtime

这段时间一直在忙新的需求,没有时间来整理代码,发表自己技术博客,今天我们来看一下YYModel的底层解析以及如何使用,希望对大家有所帮助! 一 概述 概括 YYModel是一个轻量级的JSON模型转换库,它的思路非常清晰代码风格也很好,所以还是建议大家看一下底层实现的逻辑,也可以从源码加深对Runtime的理解. 简介 下面是YYModel第三方库的一些代码结构. YYModel的总共文件只有5个文件 除掉YYModel.h之外,只剩下了YYClassInfo和NSObject+YYModel两

C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com

原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 本文由 arthinking 发表于315 天前 ⁄ itzhai.com原创文章 ⁄ C语言 ⁄ 评论数 3 ⁄ 被围观 1,775 views+ 指针数组: 在一个数组中,如果它的元素全部都是指针类

使用java解析和制作二维码

项目结构 文件源码 QR.zip 第一步:导入zxing的两个架包 core.jar和javase.jar 第二步:使用工具类 MatrixToImageWriter.java 1 package util; 2 import com.google.zxing.common.BitMatrix; 3 import javax.imageio.ImageIO; 4 import java.io.File; 5 import java.io.OutputStream; 6 import java.i

【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源热更新 Android热更新开源项目Tinker源码解析系类之三:so热更新 转载请标明本文来源:http://www.cnblogs

解释清楚智能指针二【用自己的话,解释清楚】

写在前面 用自己的话分析清楚~ 智能指针是如何使用的? 强指针是如何实现? 弱指针如何转化为强指针? 智能指针的使用 智能指针的使用必须满足如下条件: 这个类需要继承自RefBase 为什么需要虚析构函数? 虚析构函数是为了解决这样的一个问题:基类的指针指向派生类对象,并用基类的指针删除派生类对象.虚函数的出现是为了解决多态问题. 满足上述条件的类就可以定义智能指针了,普通的指针使用如下方式: MyClass *p_obj; 智能指针是这样定义: Sp<MyClass> p_obj; 强指针的

指针二三事

一.指针:用来保存地址的"变量"叫做指针,可以理解成指针是地址的一个别名. 例:定义一个整形指针 "指针的内容","指针所指向的内容","指针变量的地址": 指针的内容:指针变量p里面存放的是a的地址,也就是0x0018ff44. 指针所指向的内容:指针变量p里面存放的地址(0x18ff44)这块空间所对应的值,也就是10,我们通过*p(解引用)可以访问到这个值.即:*p作为右值时,*p==10,当*p作为左值时代表的就是a这

int?(*p)[4]?p?是二级指针?二维数组?二级指针?.xml

pre{ line-height:1; color:#2f88e4; background-color:#e9ffff; font-size:16px;}.sysFunc{color:#3d7477;font-style:italic;font-weight:bold;} .selfFuc{color:#a0b684;} .bool{color:#86ddd8;} .condition{color:#94e269;font-weight:bold;} .key{color:#ae0bfd;} .

json-lib解析json之二维JSONArray

在接口测试中,不管是接口的请求报文还是接口的响应报文,数据全部使用json,在工作中避免不了去解析响应报文以获取某个键的值,解析josn有两种方式,一种是利用jackson,还有一种就是利用json-lib,本例子用的是josn-lib,所使用的jar包是json-lib-2.2.3-jdk15.jar 下面我们来解析这个josn,获取id的值,number是一个二维JSONArray 首先要导入几个jar包,如图所示 直接上代码