使用指針值
修改和取消引用指針
有兩個(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è)清晰的了解。
-
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)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論