0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

底層解析C指針(二)

CHANBAEK ? 來源:博客園-LSWen ? 作者:博客園-LSWen ? 2023-02-15 14:48 ? 次閱讀

上一篇主要討論了C指針的本質(zhì),但并沒有解釋指針的類型問題,這次我們重點來討論指針的類型與指針內(nèi)存分配之間的關(guān)系。

對比以下兩個指針

int *p;

char *p;

單純從上面看這兩個指針有何區(qū)別?

很多讀者第一反應就是其類型不同,確實沒錯,但是我們現(xiàn)在需要從底層出發(fā),搞清楚指針類型的意義。

其實單純從上面來看,兩個指針是沒有任何區(qū)別的,其內(nèi)存的大小完全相同。

但是由于指針有++和--操作,導致指針的偏移量大小到底多大,這個就需要由類型決定。 因此類型僅僅只決定指針移動時偏移的大小。

下面我們來徹底分析指針這個問題。

程序員開始寫int *p這句時,計算機僅僅為p分配了一個四字節(jié)的內(nèi)存地址(假設(shè)編譯器為32位),而這個內(nèi)存地址中存儲的數(shù)據(jù)是多少并不知道,由于其數(shù)據(jù)可能是一個隨機數(shù),因此我們強行訪問p時會得到一些隨機的數(shù)字,這又一步說明了指針為啥需要進行初始化,但是,我們?nèi)绻榭?p時,我們可以看到這是合法的,因為我們查看的是p的地址, 即計算機為p分配的一個內(nèi)存地址,如圖所示:

截圖20230109091048.png

這個可能比較好理解

我們現(xiàn)在開始深入,看如下:(下面代碼摘自作者寫的嵌入式操作系統(tǒng)

typedef struct PCB_STRUCT
{
    struct PCB_STRUCT *TCBPrev;       //前趨指針
    struct PCB_STRUCT *TCBNext;       //后繼指針

    UINT32             TCBDlyCount;   //延時計數(shù)器
    UINT8              TCBState;      //任務(wù)狀態(tài)       255為頭部   254尾部    0表示阻塞態(tài),1表示就緒態(tài),2表示掛起態(tài)

    INT8              *TCBName;       //任務(wù)名
    FUN                TCBTask;       //任務(wù)函數(shù)指針
    UINT8             *TCBStack;      //人工堆棧
    UINT8              TCBPrio;       //任務(wù)優(yōu)先級
    pTCB              *TCBHandler;    //任務(wù)句柄  也叫任務(wù)ID   

    UINT16             TCB_SP;        //任務(wù)當前的SP指針 
}pTCB;

現(xiàn)在我們定義

pTCB *RdyTab[33];        //就緒查找表   0為空閑任務(wù)

我們現(xiàn)在思考:

RdyTab[33]的內(nèi)存分配結(jié)構(gòu)?

部分讀者會有第一反應就是內(nèi)存結(jié)構(gòu)當然是33個結(jié)構(gòu)體的大小。 如下:

其實上面是錯誤的

因為之前說過,即使是結(jié)構(gòu)體指針數(shù)組,其數(shù)組的元素本質(zhì)上仍是指針,因此,其大小也只是一個四字節(jié)的地址單元,因此,其正確的結(jié)構(gòu)如下:

那有人會有疑惑,為啥

RdyTab[i]->TCBPrev等等,這些為什么存在呢?
其實這個并不存在,這里單純指RdyTab[i]的內(nèi)存單元中,而我們需要使用RdyTab[i]->TCBPrev等等
時,必須先初始化RdyTab[i]的值,而這個RdyTab[i]->TCBPrev就是指初始化時指向內(nèi)存的首地址
偏移位置,這個工作是由編譯器完成的,如下圖所示!
截圖20230109091048.png

顯然當我們使用RdyTab[i]->TCBPrev時,其地址就是分配的結(jié)構(gòu)體所在的地址,而不是指針數(shù)組的地址。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    2947

    瀏覽量

    73730
  • 指針
    +關(guān)注

    關(guān)注

    1

    文章

    475

    瀏覽量

    70477
  • 數(shù)組
    +關(guān)注

    關(guān)注

    1

    文章

    411

    瀏覽量

    25858
  • C指針
    +關(guān)注

    關(guān)注

    0

    文章

    10

    瀏覽量

    6385
收藏 人收藏

    評論

    相關(guān)推薦

    嵌入式C語言指針

    指針相對于一級指針,顯得更難,難在于指針和數(shù)組的混合,定義不同類型的指針,在使用的時候有
    發(fā)表于 11-04 10:08 ?565次閱讀

    C語言指針詳細解析

    可以對數(shù)據(jù)本身,也可以對存儲數(shù)據(jù)的變量地址進行操作。 指針是一個占據(jù)存儲空間的實體在這一段空間起始位置的相對距離值。在C/C++語言中,指針一般被認為是
    發(fā)表于 09-14 10:03

    C指針習題答案配C指針

    C指針習題答案配C指針
    發(fā)表于 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語言指針解析

    第一章 指針的概念 指針是一個特殊的變量,它里面存儲的數(shù)值被解釋成為內(nèi)存里的一個地址。要搞清一個指針需要搞清指針的四方面的內(nèi)容:指針的類型,
    發(fā)表于 11-02 11:38 ?2次下載

    基于C語言中指針的基本用法解析

    C語言中其它的知識都學得可以,唯獨指針搞不懂。如果是這樣,我可以很負責的告訴你,對于這門編程語言,你等于是沒學。所以學好指針對于初學者是非常重要的?;蛟S你會覺得它有點抽象,但是當你徹底理解了
    的頭像 發(fā)表于 01-09 15:12 ?4745次閱讀

    C語言中的“指針”該如何理解

    在討論C語言指針時,我一直在強調(diào)“將指針看作普通數(shù)據(jù)類型”,要是讀者能夠記住這一點,在看到指針時,將其與其他普通數(shù)據(jù)類型對比分析,會發(fā)現(xiàn)
    發(fā)表于 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),我們也稱之為
    發(fā)表于 07-02 14:52 ?3747次閱讀
    <b class='flag-5'>C</b>語言<b class='flag-5'>二</b>級<b class='flag-5'>指針</b>的用法與原理

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

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

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

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

    C語言指針詳細解析

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

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

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

    底層解析C指針(一)

    指針C語言中的精髓部分,同樣也是C語言的難點所在,下面從最底層來分析C指針。
    的頭像 發(fā)表于 02-15 14:47 ?835次閱讀
    <b class='flag-5'>底層</b><b class='flag-5'>解析</b><b class='flag-5'>C</b><b class='flag-5'>指針</b>(一)

    詳解C語言指針底層基本原理

    說到指針,估計還是有很多小伙伴都還是云里霧里的,有點“知其然,而不知其所以然”。但是,不得不說,學了指針,C語言才能算是入門了。指針C語言
    的頭像 發(fā)表于 04-06 10:43 ?1166次閱讀

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

    一級指針的用法其實是取數(shù)據(jù)的地址,以此類推,指針就是取一級指針的地址,也可以表示一級指針的指向的內(nèi)容。
    發(fā)表于 05-19 17:30 ?1740次閱讀
    <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++智能指針底層實現(xiàn)原理

    C++智能指針的頭文件: #include 1. shared_ptr: 智能指針從本質(zhì)上來說是一個模板類,用類實現(xiàn)對指針對象的管理。 template class shared_pt
    的頭像 發(fā)表于 11-09 14:32 ?643次閱讀
    <b class='flag-5'>C</b>++智能<b class='flag-5'>指針</b>的<b class='flag-5'>底層</b>實現(xiàn)原理