色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

淺談void 型指針的高階用法

multisim ? 來源:嵌入式客棧 ? 作者: 逸珺 ? 2021-08-09 15:54 ? 次閱讀

要比較靈活的使用C語言實現一些高層級的框架時,需要掌握一些進階編程技巧,這篇來談談void指針的一些妙用。測試環境采用 IAR for ARM 8.40.1

什么是void指針void指針一般被稱為通用指針或叫泛指針。它是C語言關于純粹地址的一種約定。當某個指針是void型指針時,所指向的對象不屬于任何類型。 因為void指針不屬于任何類型,則不可以對其進行算術運算,比如自增,編譯器不知道其自增需要增加多少。比如char *型指針,自增一定是指針指向的地址加1,short *型指針自增,則偏移2。

在C/C++中,在任意時刻都可以使用其它類型指針來代替void指針,或者用void指針來代替其他類型指針。

由這些特性就可以衍生出很多比較有用的技巧。指針的本質,是其值為一個地址,那么延伸一下:

當使用關鍵字void聲明指針變量時,它將成為通用指針變量。任何數據類型(char,int,float等)的任何變量的地址都可以賦值給void指針變量。

對指針變量的解引用,使用間接運算符*達到目的。但是在使用空指針的情況下,需要轉換指針變量以解引用。這是因為空指針沒有與之關聯的數據類型。編譯器無法知道void指針指向的數據類型。因此,要獲取由void指針指向的數據,需要使用在void指針位置內保存的正確類型的數據進行類型轉換。

對于空指針的解引用,你如不信,就來看看栗子:

3147083e-f874-11eb-9bcf-12bb97331649.png

看到了吧,直接解引用編譯不過,因為編譯器蒙了。

但須注意的是:

不同的編譯器對void指針處理是不一樣的,如IAR,ANSI C,VC對上述都將出錯,而GNU指定“void”的算法操作與“char”一致,因此上述寫法在GNU則可以編譯

所以做個類型轉換,修正如下:

31676c32-f874-11eb-9bcf-12bb97331649.png

void型指針解引用須做類型指定。

類型轉換的時候須注意類型匹配。

另外,如果函數類型可以是任意類型的指針,則需將其參數定義為void *指針,例如string.h中關于內存操作的函數集:

__EFF_NENW1NW2 __ATTRIBUTES int memcmp(const void *, const void *,

size_t);

__EFF_NENR1NW2R1 __DEPREC_ATTRS void * memcpy(void *_Restrict,

const void *_Restrict,

size_t);

__EFF_NENR1NW2R1 __DEPREC_ATTRS void * memmove(void *, const void *,

size_t);

__EFF_NENR1R1 __DEPREC_ATTRS void * memset(void *, int, size_t);

非易失存儲管理應用在單片機開發中,往往需要實現數據的非易失存儲。所謂非易失存儲,就是數據改寫后在掉電后仍然能保持。哪些是非易失存儲介質呢?比如EEPROM,FLASH等都屬于非易失存儲介質。

比如一個產品里面有很多各種各樣的參數,且分布在各個子系統文件中。舉個栗子:

/*模塊A中有這樣一個結構體需要非易失存儲*/typedef struct _t_paras{

int language;/*語言種類*/

char SN[20]; /*產品序列號*/

}T_PARAS;

T_PARAS sysParas;

/*模塊B中有這樣一個結構體需要非易失存儲*/typedef struct _t_pid{

float kp;

float ki;

float kd;

float T;

}T_PID;

T_PID pidParas;

面對這樣一個需求,要實現非易失存儲,我在將底層的EEPROM/FLASH讀寫函數實現的基礎上,將上述應用數據按照一定順序存儲管理。那么更為理想的方式是什么呢?設計一個模塊專門負責存儲非易失數據。比如:

typedef struct _t_nv_layout{

void * pElement; /*參數地址*/

int length; /*參數長度*/

}T_NV_LAYOUT;

/*參數映射表*/

T_NV_LAYOUT nvLayout[]={

{&sysParas,sizeof(T_PARAS)},/*參數映射記錄*/

{&pidParas,sizeof(T_PID)},

。。。

};

/*參數映射表記錄條數*/#define NV_RECORD_NUMBER (sizeof(nvLayout)/sizeof(T_NV_LAYOUT))void nv_load(T_NV_LAYOUT *pLayout,int nvAddr,int number);

void nv_store(T_NV_LAYOUT *pLayout,int nvAddr,int number);

將上述設計思想,利用UML描述一下:

在上述基礎上,我們只需要設計硬件層抽象,即可設計出一個可行的、比較通用的NV管理子系統,這樣設計出的子系統忽略了業務數據,僅僅將其處理為數據,并不關心其業務意義。實現了業務邏輯與后臺的隔離解耦。做到了通用性。這里就比較巧妙的利用了void *指針的特性。如果對于該設計思想,在進一步延伸,將底層的抽象在做一層封裝,將更細節的底層實現細節隔離抽象,比如:

抽象I2C/SPI EEPROM,將其對上層的調用接口統一,那么如果你的系統原本是存儲在I2C EEPROM中,現在做一個新項目,你需要使用另外一種SPI接口的EEPROM,則只需要實現相應的底層處理函數即可。

將存儲介質抽象,比如是EEPROM/DATA FLASH等。。。

。。。。

那么怎么做到底層抽象呢,我們可以利用函數指針定義統一的接口,具體部署時,只需要將實現函數的指針賦值給對應的函數指針即可,這樣就做到了接口的抽象統一。其實這就是驅動模型的一個簡易雛形。

總結一下這篇文章引入了一些編程思想,對于單片機/嵌入式進階編程比較有用:

利用void *指針,將業務數據與底層存儲實現了抽象解耦

利用分層抽象實現了代碼具有良好的可移植性

利用函數指針實現了C++等高級語言的虛函數定義接口的思想

統一接口底層實現抽象,實現了驅動分層的思想

void *指針由這個例子,可以延伸出很多類似的應用

啟示:一些語言細節如果深入了解其背后的機理,可以得到很多比較巧妙的應用。

免責聲明:本文素材來源網絡,版權歸原作者所有。如涉及作品版權問題,請與我聯系刪除。

編輯:jq

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

    關注

    0

    文章

    122

    瀏覽量

    30858
  • C++
    C++
    +關注

    關注

    22

    文章

    2108

    瀏覽量

    73623
  • void
    +關注

    關注

    0

    文章

    23

    瀏覽量

    9866

原文標題:void 型指針的高階用法,你掌握了嗎?

文章出處:【微信號:A1411464185,微信公眾號:multisim】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    C語言指針學習筆記

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

    C語言指針運算符詳解

    在C語言中,當你有一個指向數組中某個元素的指針時,你可以對該指針執行某些算術運算,例如加法或減法。這些運算可以用來遍歷數組中的元素,如ptr[i]等價于*(ptr + i)。然而,如果你的操作使得指針指向了數組以外的位置(除了數
    的頭像 發表于 10-30 11:16 ?239次閱讀

    C語言指針詳細解析

    ,pa,*pa); return 0; } 指針類型 變量有不同的類型,整型,浮點等等。指針同樣是有類型的,定義如下。 char*pa = NULL; int* pb = NULL; short
    發表于 09-14 10:03

    面試常考+1:函數指針指針函數、數組指針指針數組

    在嵌入式開發領域,函數指針指針函數、數組指針指針數組是一些非常重要但又容易混淆的概念。理解它們的特性和應用場景,對于提升嵌入式程序的效率和質量至關重要。一、
    的頭像 發表于 08-10 08:11 ?830次閱讀
    面試常考+1:函數<b class='flag-5'>指針</b>與<b class='flag-5'>指針</b>函數、數組<b class='flag-5'>指針</b>與<b class='flag-5'>指針</b>數組

    面試中的高頻問題:指針函數與函數指針,你能完美應對嗎?

    一直覺得C語言較其他語言最偉大的地方就是C語言中的指針,有些人認為指針很簡單,而有些人認為指針很難,當然這里的對簡單和難并不是等價于對指針的理解程度。為此在這里對C語言中的
    的頭像 發表于 06-22 08:11 ?1705次閱讀
    面試中的高頻問題:<b class='flag-5'>指針</b>函數與函數<b class='flag-5'>指針</b>,你能完美應對嗎?

    STM8默認指針類型完全可用滿足需求尋址到0X0000~9FFF的空間,為什么要強制使用@far的呢?

    在STM8的中斷文件中有這樣一句 typedef void @far (*interrupt_handler_t)(void); 1、字面意思:這個指針interrupt_handler_t所指
    發表于 05-09 06:51

    FPGA的高階應用與發展方向討論

    FPGA可編程器件做高階應用如圖像處理、語音識別等需要具備哪些能力,需要怎樣更有效從入門到精通 ? FPGA與當下的AI發展結合的怎樣?大家可以交流討論
    發表于 03-30 18:09

    為什么指針之間不要隨意賦值呢?

    指針之間也不能隨意賦值。
    的頭像 發表于 03-28 17:13 ?651次閱讀
    為什么<b class='flag-5'>指針</b>之間不要隨意賦值呢?

    字符指針等變量等該如何初始化

     對于數值類型的變量往往初始化為0,但對于其他類型的變量,如字符指針等變量等該如何初始化呢?
    的頭像 發表于 03-18 11:02 ?1434次閱讀

    函數指針與回調函數的應用實例

    通常我們說的指針變量是指向一個整型、字符或數組等變量,而函數指針是指向函數。 函數指針可以像一般函數一樣,用于調用函數、傳遞參數。
    的頭像 發表于 03-07 11:13 ?400次閱讀
    函數<b class='flag-5'>指針</b>與回調函數的應用實例

    C語言的指針用法

    C語言編程中善用指針可以簡化一些任務的處理,而對于一些任務(比如動態內存分配),必須要有指針才行的。也就是說精通C指針編程是很有必要的,幫助你成為一名優秀的Cer。
    發表于 03-05 14:22 ?346次閱讀
    C語言的<b class='flag-5'>指針</b><b class='flag-5'>用法</b>

    怎么理解指針指針

    怎么理解指針指針?其實這個概念并不難,只是把它放到實際應用中,容易造成困擾。
    的頭像 發表于 02-23 16:46 ?1173次閱讀
    怎么理解<b class='flag-5'>指針</b>的<b class='flag-5'>指針</b>?

    結構體與指針的關系

    指針則是指向結構體類型的指針,用于操作和訪問結構體的成員。下面我們將分別詳細解釋結構體和結構體指針,并提供相應的示例代碼。1.結構體:結構體是一種自定義數據類型
    的頭像 發表于 01-11 08:00 ?980次閱讀
    結構體與<b class='flag-5'>指針</b>的關系

    函數指針指針函數是不是一個東西?

    函數指針的本質是指針,就跟整型指針、字符指針一樣,函數指針指向的是一個函數。
    的頭像 發表于 01-03 16:35 ?526次閱讀
    函數<b class='flag-5'>指針</b>和<b class='flag-5'>指針</b>函數是不是一個東西?

    split在python中的用法

    split在python中的用法 split()是Python中一個非常常用的字符串函數,它能夠根據指定的分隔符將一個字符串分割成多個子字符串,并返回一個包含這些子字符串的列表。本文將詳細介紹
    的頭像 發表于 12-25 15:12 ?2018次閱讀
    主站蜘蛛池模板: 一本道高清码| 一个人免费观看在线视频播放| 啦啦啦 中国 日本 高清 在线| 国产亚洲精品第一区香蕉| GOGOGO高清在线播放韩国| 最近2019中文字幕免费| 亚洲乱码AV久久久久久久| 性xxxx18公交车| 天天摸夜添狠狠添高| 日本三级黄色大片| 欧美又粗又长又大AAAA片| 女人张开腿让男人桶爽免| 免费一区在线观看| 美女议员被泄裸照| 免费精品美女久久久久久久久| 理论937| 理论片午午伦夜理片影院| 久久影院中文字幕| 麻豆AV蜜桃AV久久| 蜜臀久久99精品久久久久久做爰 | 亚洲男人97色综合久久久| 午夜福利理论片高清在线| 无人区免费一二三四乱码| 香蕉久久夜色精品国产小说| 玩弄放荡人妻一区二区三区| 天天看学生视频| 亚洲欧洲日产国产 最新| 亚洲午夜无码久久久久蜜臀av| 一个人在线观看免费高清视频| 中文在线日韩亚洲制服| 99久久精品费精品国产| 擦擦擦在线视频观看| 国产精品嫩草影院一区二区三区| 国产色精品VR一区二区| 精品亚洲欧美中文字幕在线看| 久就热视频精品免费99| 女生扒开尿口| 忘忧草研究所 麻豆| 一个人看的WWW高清电影| 99热最新网站| 国产成+人欧美+综合在线观看|