精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

    文章

    3002

    瀏覽量

    73887
  • 指針
    +關注

    關注

    1

    文章

    480

    瀏覽量

    70511
  • 數組
    +關注

    關注

    1

    文章

    416

    瀏覽量

    25910
  • C指針
    +關注

    關注

    0

    文章

    10

    瀏覽量

    6395
收藏 人收藏

    評論

    相關推薦

    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 ?4774次閱讀

    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 ?3788次閱讀
    <b class='flag-5'>C</b>語言<b class='flag-5'>二</b>級<b class='flag-5'>指針</b>的用法與原理

    從最底層的內存存儲空間開始帶你了解C語言指針

    一、前言 、變量與指針的本質 三、指針的幾個相關概念 四、指向不同數據類型的指針 五、總結 一、前言 如果問C語言中最重要、威力最大的概念
    的頭像 發表于 02-02 10:40 ?2409次閱讀
    從最<b class='flag-5'>底層</b>的內存存儲空間開始帶你了解<b class='flag-5'>C</b>語言<b class='flag-5'>指針</b>

    簡述C語言中什么是懸空指針和野指針

    提起C語言大部分開發者很自然就會想到指針字,沒錯,作為C的核心和靈魂,它的地位咱們就不再贅述了,今天我們想跟大家講的是指針中的兩個特有名詞
    的頭像 發表于 03-18 11:18 ?2401次閱讀

    C語言指針詳細解析

    可以對數據本身,也可以對存儲數據的變量地址進行操作。 指針是一個占據存儲空間的實體在這一段空間起始位置的相對距離值。在C/C++語言中,指針一般被認為是
    的頭像 發表于 11-14 16:53 ?2181次閱讀
    <b class='flag-5'>C</b>語言<b class='flag-5'>指針</b>詳細<b class='flag-5'>解析</b>

    C語言中的懸空指針和野指針是什么意思?

    提起C語言大部分開發者很自然就會想到指針字,沒錯,作為C的核心和靈魂,它的地位咱們就不再贅述了,今天我們想跟大家講的是指針中的兩個特有名詞
    的頭像 發表于 02-09 17:20 ?1066次閱讀

    底層解析C指針(一)

    指針C語言中的精髓部分,同樣也是C語言的難點所在,下面從最底層來分析C指針
    的頭像 發表于 02-15 14:47 ?870次閱讀
    <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 ?1212次閱讀

    C語言中一級指針指針和三級指針

    一級指針的用法其實是取數據的地址,以此類推,指針就是取一級指針的地址,也可以表示一級指針的指向的內容。
    發表于 05-19 17:30 ?1875次閱讀
    <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 ?706次閱讀
    <b class='flag-5'>C</b>++智能<b class='flag-5'>指針</b>的<b class='flag-5'>底層</b>實現原理

    C語言指針學習筆記

    本文從底層內存分析,徹底讓讀者明白C語言指針的本質。
    的頭像 發表于 11-05 17:40 ?161次閱讀
    <b class='flag-5'>C</b>語言<b class='flag-5'>指針</b>學習筆記