0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

底层解析C指针(二)

CHANBAEK 来源:博客园-LSWen 作者:博客园-LSWen 2023-02-15 14:48 次阅读

上一篇主要讨论了C指针的本质,但并没有解释指针的类型问题,这次我们重点来讨论指针的类型与指针内存分配之间的关系。

对比以下两个指针

int *p;

char *p;

单纯从上面看这两个指针有何区别?

很多读者第一反应就是其类型不同,确实没错,但是我们现在需要从底层出发,搞清楚指针类型的意义。

其实单纯从上面来看,两个指针是没有任何区别的,其内存的大小完全相同。

但是由于指针有++和--操作,导致指针的偏移量大小到底多大,这个就需要由类型决定。 因此类型仅仅只决定指针移动时偏移的大小。

下面我们来彻底分析指针这个问题。

程序员开始写int *p这句时,计算机仅仅为p分配了一个四字节的内存地址(假设编译器为32位),而这个内存地址中存储的数据是多少并不知道,由于其数据可能是一个随机数,因此我们强行访问p时会得到一些随机的数字,这又一步说明了指针为啥需要进行初始化,但是,我们如果查看&p时,我们可以看到这是合法的,因为我们查看的是p的地址, 即计算机为p分配的一个内存地址,如图所示:

截图20230109091048.png

这个可能比较好理解

我们现在开始深入,看如下:(下面代码摘自作者写的嵌入式操作系统

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就是指初始化时指向内存的首地址
偏移位置,这个工作是由编译器完成的,如下图所示!
截图20230109091048.png

显然当我们使用RdyTab[i]->TCBPrev时,其地址就是分配的结构体所在的地址,而不是指针数组的地址。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内存
    +关注

    关注

    8

    文章

    3025

    浏览量

    74054
  • 指针
    +关注

    关注

    1

    文章

    480

    浏览量

    70564
  • 数组
    +关注

    关注

    1

    文章

    417

    浏览量

    25947
  • C指针
    +关注

    关注

    0

    文章

    10

    浏览量

    6401
收藏 人收藏

    评论

    相关推荐

    C语言指针详细解析

    可以对数据本身,也可以对存储数据的变量地址进行操作。 指针是一个占据存储空间的实体在这一段空间起始位置的相对距离值。在C/C++语言中,指针一般被认为是
    发表于 09-14 10:03

    C指针习题答案配C指针

    C指针习题答案配C指针
    发表于 09-07 14:29 6次下载
    <b class='flag-5'>C</b>和<b class='flag-5'>指针</b>习题答案配<b class='flag-5'>C</b>和<b class='flag-5'>指针</b>

    C语言指针解析

    第一章 指针的概念 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型,
    发表于 11-02 11:38 2次下载

    基于C语言中指针的基本用法解析

    C语言中其它的知识都学得可以,唯独指针搞不懂。如果是这样,我可以很负责的告诉你,对于这门编程语言,你等于是没学。所以学好指针对于初学者是非常重要的。或许你会觉得它有点抽象,但是当你彻底理解了
    的头像 发表于 01-09 15:12 4800次阅读

    C语言中的“指针”该如何理解

    在讨论C语言指针时,我一直在强调“将指针看作普通数据类型”,要是读者能够记住这一点,在看到指针时,将其与其他普通数据类型对比分析,会发现
    发表于 07-31 16:58 1.2w次阅读
    <b class='flag-5'>C</b>语言中的“<b class='flag-5'>二</b>级<b class='flag-5'>指针</b>”该如何理解

    C语言指针的用法与原理

    提到指针,我们都知道指针是用来存储一个变量的地址。所以,当我们定义了一个指向指针指针的时候(pointer to pointer),我们也称之为
    发表于 07-02 14:52 3826次阅读
    <b class='flag-5'>C</b>语言<b class='flag-5'>二</b>级<b class='flag-5'>指针</b>的用法与原理

    从最底层的内存存储空间开始带你了解C语言指针

    一、前言 、变量与指针的本质 三、指针的几个相关概念 四、指向不同数据类型的指针 五、总结 一、前言 如果问C语言中最重要、威力最大的概念
    的头像 发表于 02-02 10:40 2434次阅读
    从最<b class='flag-5'>底层</b>的内存存储空间开始带你了解<b class='flag-5'>C</b>语言<b class='flag-5'>指针</b>

    简述C语言中什么是悬空指针和野指针

    提起C语言大部分开发者很自然就会想到指针字,没错,作为C的核心和灵魂,它的地位咱们就不再赘述了,今天我们想跟大家讲的是指针中的两个特有名词
    的头像 发表于 03-18 11:18 2430次阅读

    C语言指针详细解析

    可以对数据本身,也可以对存储数据的变量地址进行操作。 指针是一个占据存储空间的实体在这一段空间起始位置的相对距离值。在C/C++语言中,指针一般被认为是
    的头像 发表于 11-14 16:53 2222次阅读
    <b class='flag-5'>C</b>语言<b class='flag-5'>指针</b>详细<b class='flag-5'>解析</b>

    C语言中的悬空指针和野指针是什么意思?

    提起C语言大部分开发者很自然就会想到指针字,没错,作为C的核心和灵魂,它的地位咱们就不再赘述了,今天我们想跟大家讲的是指针中的两个特有名词
    的头像 发表于 02-09 17:20 1098次阅读

    底层解析C指针(一)

    指针C语言中的精髓部分,同样也是C语言的难点所在,下面从最底层来分析C指针
    的头像 发表于 02-15 14:47 893次阅读
    <b class='flag-5'>底层</b><b class='flag-5'>解析</b><b class='flag-5'>C</b><b class='flag-5'>指针</b>(一)

    详解C语言指针底层基本原理

    说到指针,估计还是有很多小伙伴都还是云里雾里的,有点“知其然,而不知其所以然”。但是,不得不说,学了指针C语言才能算是入门了。指针C语言
    的头像 发表于 04-06 10:43 1262次阅读

    C语言中一级指针指针和三级指针

    一级指针的用法其实是取数据的地址,以此类推,指针就是取一级指针的地址,也可以表示一级指针的指向的内容。
    发表于 05-19 17:30 2061次阅读
    <b class='flag-5'>C</b>语言中一级<b class='flag-5'>指针</b>、<b class='flag-5'>二</b>级<b class='flag-5'>指针</b>和三级<b class='flag-5'>指针</b>

    C++智能指针底层实现原理

    C++智能指针的头文件: #include 1. shared_ptr: 智能指针从本质上来说是一个模板类,用类实现对指针对象的管理。 template class shared_pt
    的头像 发表于 11-09 14:32 748次阅读
    <b class='flag-5'>C</b>++智能<b class='flag-5'>指针</b>的<b class='flag-5'>底层</b>实现原理

    C语言指针学习笔记

    本文从底层内存分析,彻底让读者明白C语言指针的本质。
    的头像 发表于 11-05 17:40 240次阅读
    <b class='flag-5'>C</b>语言<b class='flag-5'>指针</b>学习笔记