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

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

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

C語(yǔ)言固件中指針的使用方法

multisim ? 來(lái)源:21IC ? 作者:21IC ? 2020-09-26 11:38 ? 次閱讀

使用指針值

修改和取消引用指針

有兩個(gè)與指針關(guān)聯(lián)的值。第一個(gè)是存儲(chǔ)在指針本身中的存儲(chǔ)地址,第二個(gè)是存儲(chǔ)在該存儲(chǔ)地址中的數(shù)據(jù)。要修改存儲(chǔ)在指針變量中的地址,只需使用等號(hào):

RxByte_ptr = 0x40;

復(fù)制代碼

要訪問(wèn)存儲(chǔ)在指針地址處的數(shù)據(jù),請(qǐng)使用星號(hào)。這適用于閱讀和寫(xiě)作。

ReceivedData = *RxByte_ptr; *TxByte_ptr = TransmitData;

復(fù)制代碼

訪問(wèn)指針?biāo)赶虻闹捣Q(chēng)為解引用,星號(hào)(與指針一起使用)稱(chēng)為解引用運(yùn)算符。

獲取變量的地址

與指針的使用有關(guān)的一個(gè)重要細(xì)節(jié)是C“地址”運(yùn)算符。此符號(hào)為&。盡管&附加在普通變量而非指針上,但我仍將其視為“指針運(yùn)算符”,因?yàn)樗氖褂门c指針實(shí)現(xiàn)緊密相關(guān)。

當(dāng)在變量名的前面加上&時(shí),程序?qū)⑹褂米兞康牡刂范皇亲兞康闹怠?/p>

即使您不知道特定變量將在內(nèi)存中的位置,這也使您可以將變量的地址放置在指針中。在以下代碼片段中演示了&運(yùn)算符的用法,該代碼片段還用作基本指針用法的摘要。

《div id=“code_v2m”》

char displayChar; char TestingVariable; char *DisplayChar_ptr; DisplayChar = 0x41; DisplayChar_ptr = &DisplayChar; TestingVariable = *DisplayChar_ptr; *DisplayChar_ptr = 0x42; TestingVariable = DisplayChar;

復(fù)制代碼這是此代碼的逐步說(shuō)明:

DisplayChar = 0x41;

復(fù)制代碼

現(xiàn)在,DisplayChar變量將保存與ASCII‘A’相對(duì)應(yīng)的值。

DisplayChar_ptr = &DisplayChar;

復(fù)制代碼

指針(DisplayChar_ptr)現(xiàn)在保存變量DisplayChar的地址。我們不知道該地址是什么,即我們不知道DisplayChar_ptr中存儲(chǔ)的數(shù)字。此外,我們不需要知道;這是編譯器的業(yè)務(wù),而不是我們的業(yè)務(wù)。

TestingVariable = *DisplayChar_ptr;

復(fù)制代碼

現(xiàn)在,TestingVariable保存DisplayChar變量的值,即0x41。

*DisplayChar_ptr = 0x42;

復(fù)制代碼

我們剛剛使用了指針來(lái)修改存儲(chǔ)在與DisplayChar變量對(duì)應(yīng)的地址中的值;現(xiàn)在它具有0x42,即ASCII‘B’。

TestingVariable = DisplayChar;

復(fù)制代碼

現(xiàn)在,TestingVariable的值為0x42。

指針?biāo)阈g(shù)

TxByte = *(TxBuffer + 1); TxByte = TxBuffer[1];

復(fù)制代碼

在大多數(shù)情況下,C變量持有一個(gè)可以變化的值,指針變量也不例外。用于修改指針值的常見(jiàn)算術(shù)運(yùn)算是加法(例如TxByte_ptr = TxByte_ptr + 4),減法(TxByte_ptr = TxByte_ptr-4),增量(TxByte_ptr ++)和減量(TxByte_ptr--)。只要兩個(gè)指針具有相同的數(shù)據(jù)類(lèi)型,就可以從另一個(gè)指針中減去一個(gè)指針。但是,您不能將一個(gè)指針添加到另一指針。

指針?biāo)阈g(shù)并不像看起來(lái)那樣簡(jiǎn)單。假設(shè)您有一個(gè)數(shù)據(jù)類(lèi)型為long的指針。您正在調(diào)試一些代碼,當(dāng)前正在單步執(zhí)行一個(gè)例程,該例程會(huì)重復(fù)遞增該指針。您在“監(jiān)視”窗口中注意到,指針的值不會(huì)隨著每次增加而增加一。這里發(fā)生了什么?

如果您不能輕易想到答案,則應(yīng)該花更多的時(shí)間考慮指針的性質(zhì)。此代碼中的指針與長(zhǎng)變量(即占用四個(gè)字節(jié)內(nèi)存的變量)一起使用。當(dāng)您增加指針時(shí),您實(shí)際上并不希望指針的值增加一個(gè)內(nèi)存位置(在此假設(shè)內(nèi)存是按字節(jié)組織的)。而是,您希望它增加四個(gè)存儲(chǔ)位置,以便它指向下一個(gè)long變量。編譯器知道這一點(diǎn),并相應(yīng)地修改了指針的值。

當(dāng)您向指針添加數(shù)字或從指針減去數(shù)字時(shí),也會(huì)發(fā)生同樣的事情。指針中存儲(chǔ)的地址不一定會(huì)增加或減少該數(shù)字。相反,它將增加或減少該數(shù)字乘以指針數(shù)據(jù)類(lèi)型的字節(jié)大小。

指針和數(shù)組

指針和數(shù)組密切相關(guān)。聲明數(shù)組時(shí),實(shí)際上是在創(chuàng)建一個(gè)常量指針,該常量指針始終保存數(shù)組的起始地址,并且我們用來(lái)訪問(wèn)數(shù)組元素的索引符號(hào)也可以與指針一起使用。

例如,假設(shè)您有一個(gè)名為T(mén)xBuffer的char指針,該指針當(dāng)前保存地址0x30。以下代碼片段顯示了兩種等效的訪問(wèn)地址0x31處數(shù)據(jù)的方式。

TxByte = *(TxBuffer + 1); TxByte = TxBuffer[1];

復(fù)制代碼

何時(shí)使用指針

在本節(jié)中,我想簡(jiǎn)要討論兩種編碼情況,它們可以受益于指針的使用,并且與嵌入式應(yīng)用程序特別相關(guān)。

指針與數(shù)組

從上一節(jié)的討論中可以很自然地得出第一個(gè)。指針提供了另一種處理以數(shù)組形式存儲(chǔ)的數(shù)據(jù)的方法。在給定例程的上下文中,指針?lè)椒赡芨庇^或更方便。

但是,在某些情況下,基于指針的實(shí)現(xiàn)可以提高代碼速度。我的理解是,在編譯器高度復(fù)雜并且能夠進(jìn)行如此廣泛的優(yōu)化之前,這在過(guò)去更為正確。不過(guò),在嵌入式開(kāi)發(fā)的背景下,我認(rèn)為在某些情況下指針可以提供不可忽略的執(zhí)行速度改進(jìn)。如果您確實(shí)試圖達(dá)到執(zhí)行給定代碼部分所需的最小時(shí)鐘周期數(shù),那么值得嘗試一下指針。

將指針傳遞給函數(shù)

功能的廣泛使用可幫助您編寫(xiě)井井有條的模塊化代碼。這是一件好事,盡管C施加了在某些情況下可能很尷尬的限制:一個(gè)函數(shù)只能有一個(gè)返回值。換句話說(shuō),它只能修改一個(gè)變量,除非使用指針。

此技術(shù)的工作原理如下:

包括一個(gè)指針作為該函數(shù)的輸入之一。

使用&運(yùn)算符將變量的地址傳遞給函數(shù)。

在函數(shù)內(nèi)部,變量的地址成為指針的值,并且函數(shù)使用解引用運(yùn)算符修改原始變量的值。

即使原始變量沒(méi)有直接通過(guò)返回值進(jìn)行修改,該函數(shù)之后的代碼也假定該變量的值已被修改。

這是一個(gè)例子:

#define STEPSIZE 3

char IncreaseCnt_and_CheckLED(char *Count)

{

*Count = *Count + STEPSIZE;

IF(LED == TRUE)

return TRUE;

else

return FALSE;

}

int main()

{

char RisingEdgeCount = 0;

char LED_State;

。..

。..

LED_State = IncreaseCnt_and_CheckLED(&RisingEdgeCount);

。..

。..

}

復(fù)制代碼

結(jié)論

我希望您現(xiàn)在對(duì)C語(yǔ)言固件中的指針以及如何開(kāi)始使用它們有一個(gè)清晰的了解。

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

    關(guān)注

    180

    文章

    7581

    瀏覽量

    135649

原文標(biāo)題:如何在C語(yǔ)言固件中使用指針

文章出處:【微信號(hào):A1411464185,微信公眾號(hào):multisim】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C語(yǔ)言關(guān)鍵字--typedef

    C語(yǔ)言關(guān)鍵字使用方法學(xué)習(xí)指南!
    的頭像 發(fā)表于 10-07 12:44 ?120次閱讀

    C語(yǔ)言指針詳細(xì)解析

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

    指定初始器的使用方法及優(yōu)點(diǎn)

    隨著C語(yǔ)言的發(fā)展,C99標(biāo)準(zhǔn)引入了一些新的特性,極大地方便了程序員的編碼工作。其中一個(gè)非常實(shí)用且強(qiáng)大的功能便是“指定初始器”(Designated Initializers)。在這篇文章中,我們將深入探討指定初始器的
    的頭像 發(fā)表于 08-29 09:51 ?216次閱讀

    面試中的高頻問(wèn)題:指針函數(shù)與函數(shù)指針,你能完美應(yīng)對(duì)嗎?

    一直覺(jué)得C語(yǔ)言較其他語(yǔ)言最偉大的地方就是C語(yǔ)言中的指針,有些人認(rèn)為
    的頭像 發(fā)表于 06-22 08:11 ?1340次閱讀
    面試中的高頻問(wèn)題:<b class='flag-5'>指針</b>函數(shù)與函數(shù)<b class='flag-5'>指針</b>,你能完美應(yīng)對(duì)嗎?

    指針式萬(wàn)用表的使用方法與注意事項(xiàng)

    ,從而測(cè)出電路中的電流、電壓和電阻等參數(shù)。本文將詳細(xì)介紹指針式萬(wàn)用表的使用方法和注意事項(xiàng),幫助讀者更好地掌握這一工具。
    的頭像 發(fā)表于 05-14 18:04 ?1729次閱讀

    C語(yǔ)言指針用法

    C語(yǔ)言編程中善用指針可以簡(jiǎn)化一些任務(wù)的處理,而對(duì)于一些任務(wù)(比如動(dòng)態(tài)內(nèi)存分配),必須要有指針才行的。也就是說(shuō)精通C
    發(fā)表于 03-05 14:22 ?288次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>的<b class='flag-5'>指針</b>用法

    怎么寫(xiě)出效率高、思路清晰的C語(yǔ)言程序?

    要用C語(yǔ)言的思維方式來(lái)進(jìn)行程序的構(gòu)架構(gòu)建 要有良好的C語(yǔ)言算法基礎(chǔ),以此來(lái)實(shí)現(xiàn)程序的邏輯構(gòu)架 靈活運(yùn)用C
    的頭像 發(fā)表于 01-02 14:20 ?493次閱讀

    c語(yǔ)言scanf的正確使用及技巧

    函數(shù)的正確使用及一些技巧。 scanf函數(shù)的基本用法 scanf函數(shù)是通過(guò)格式控制字符串來(lái)確定輸入變量的類(lèi)型和格式的。它的基本使用方法是,首先將需要讀取的變量的地址傳遞給scanf函數(shù),然后在格式控制字符串中指定變量的類(lèi)型。例如,要讀取一個(gè)整數(shù)并將
    的頭像 發(fā)表于 11-24 10:04 ?4124次閱讀

    c語(yǔ)言max函數(shù)的使用方法

    C語(yǔ)言是一門(mén)廣泛使用的編程語(yǔ)言,提供了許多內(nèi)置的函數(shù)來(lái)執(zhí)行各種任務(wù)。其中一個(gè)非常有用的函數(shù)是max函數(shù),它用于比較兩個(gè)值并返回較大的那個(gè)值。在本文中,我們將詳細(xì)介紹max函數(shù)的使用方法
    的頭像 發(fā)表于 11-22 10:15 ?1.2w次閱讀

    C語(yǔ)言中鏈表的作用是什么?

    對(duì)C語(yǔ)言中指針用的很少,鏈表、文件操作幾乎沒(méi)用過(guò),所以也不能理解到底有什么作用。各位有經(jīng)常在做程序時(shí)會(huì)用到這些嗎。
    發(fā)表于 11-06 06:23

    淺談C語(yǔ)言面向?qū)ο缶幊趟枷?/a>

    C語(yǔ)言是一種面向過(guò)程的語(yǔ)言,但是也可以用結(jié)構(gòu)體和函數(shù)指針來(lái)模擬面向?qū)ο蟮奶匦?,比如封裝、繼承和多態(tài)。
    發(fā)表于 11-02 12:27 ?943次閱讀

    C語(yǔ)言運(yùn)算符的使用方法

    詳細(xì)介紹了C語(yǔ)言表達(dá)式、算術(shù)運(yùn)算符、賦值運(yùn)算符、關(guān)系運(yùn)算符、條件結(jié)構(gòu)、邏輯運(yùn)算符、位運(yùn)算符的語(yǔ)法和使用方法,并討論了運(yùn)算符的優(yōu)先級(jí)。
    發(fā)表于 11-02 11:30 ?1279次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>運(yùn)算符的<b class='flag-5'>使用方法</b>

    C語(yǔ)言條件結(jié)構(gòu)的使用方法

    前面討論了簡(jiǎn)單的條件結(jié)構(gòu)。條件結(jié)構(gòu)用于實(shí)現(xiàn)需要判斷的情況,它以一個(gè)邏輯條件成立與否為條件,決定一個(gè)操作的執(zhí)行或不執(zhí)行,或執(zhí)行兩個(gè)不同的操作。前面介紹的if和if-else結(jié)構(gòu),它是C語(yǔ)言中實(shí)現(xiàn)判斷
    發(fā)表于 11-02 11:27 ?1506次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>條件結(jié)構(gòu)的<b class='flag-5'>使用方法</b>

    C語(yǔ)言循環(huán)結(jié)構(gòu)的使用方法

    詳細(xì)介紹了C語(yǔ)言while循環(huán)結(jié)構(gòu)、do-while循環(huán)結(jié)構(gòu)、for循環(huán)結(jié)構(gòu)、循環(huán)退出語(yǔ)句的語(yǔ)法和使用方法。
    發(fā)表于 11-02 11:26 ?1363次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>循環(huán)結(jié)構(gòu)的<b class='flag-5'>使用方法</b>

    C語(yǔ)言中數(shù)字怎么轉(zhuǎn)成指針

    C語(yǔ)言中數(shù)字怎么轉(zhuǎn)成指針,比如我要去內(nèi)存地址為0x100的內(nèi)容,用一句話表達(dá),不如uchar a=?我要問(wèn)號(hào)等于0x100地址的內(nèi)容
    發(fā)表于 10-31 06:29