使用指針值
修改和取消引用指針
有兩個與指針關(guān)聯(lián)的值。第一個是存儲在指針本身中的存儲地址,第二個是存儲在該存儲地址中的數(shù)據(jù)。要修改存儲在指針變量中的地址,只需使用等號:
RxByte_ptr = 0x40;
復(fù)制代碼
要訪問存儲在指針地址處的數(shù)據(jù),請使用星號。這適用于閱讀和寫作。
ReceivedData = *RxByte_ptr; *TxByte_ptr = TransmitData;
復(fù)制代碼
訪問指針?biāo)赶虻闹捣Q為解引用,星號(與指針一起使用)稱為解引用運算符。

獲取變量的地址
與指針的使用有關(guān)的一個重要細節(jié)是C“地址”運算符。此符號為&。盡管&附加在普通變量而非指針上,但我仍將其視為“指針運算符”,因為它的使用與指針實現(xiàn)緊密相關(guān)。
當(dāng)在變量名的前面加上&時,程序?qū)⑹褂米兞康牡刂范皇亲兞康闹怠?/p>

即使您不知道特定變量將在內(nèi)存中的位置,這也使您可以將變量的地址放置在指針中。在以下代碼片段中演示了&運算符的用法,該代碼片段還用作基本指針用法的摘要。
《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ù)制代碼這是此代碼的逐步說明:
DisplayChar = 0x41;
復(fù)制代碼
現(xiàn)在,DisplayChar變量將保存與ASCII‘A’相對應(yīng)的值。
DisplayChar_ptr = &DisplayChar;
復(fù)制代碼
指針(DisplayChar_ptr)現(xiàn)在保存變量DisplayChar的地址。我們不知道該地址是什么,即我們不知道DisplayChar_ptr中存儲的數(shù)字。此外,我們不需要知道;這是編譯器的業(yè)務(wù),而不是我們的業(yè)務(wù)。
TestingVariable = *DisplayChar_ptr;
復(fù)制代碼
現(xiàn)在,TestingVariable保存DisplayChar變量的值,即0x41。
*DisplayChar_ptr = 0x42;
復(fù)制代碼
我們剛剛使用了指針來修改存儲在與DisplayChar變量對應(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變量持有一個可以變化的值,指針變量也不例外。用于修改指針值的常見算術(shù)運算是加法(例如TxByte_ptr = TxByte_ptr + 4),減法(TxByte_ptr = TxByte_ptr-4),增量(TxByte_ptr ++)和減量(TxByte_ptr--)。只要兩個指針具有相同的數(shù)據(jù)類型,就可以從另一個指針中減去一個指針。但是,您不能將一個指針添加到另一指針。
指針?biāo)阈g(shù)并不像看起來那樣簡單。假設(shè)您有一個數(shù)據(jù)類型為long的指針。您正在調(diào)試一些代碼,當(dāng)前正在單步執(zhí)行一個例程,該例程會重復(fù)遞增該指針。您在“監(jiān)視”窗口中注意到,指針的值不會隨著每次增加而增加一。這里發(fā)生了什么?
如果您不能輕易想到答案,則應(yīng)該花更多的時間考慮指針的性質(zhì)。此代碼中的指針與長變量(即占用四個字節(jié)內(nèi)存的變量)一起使用。當(dāng)您增加指針時,您實際上并不希望指針的值增加一個內(nèi)存位置(在此假設(shè)內(nèi)存是按字節(jié)組織的)。而是,您希望它增加四個存儲位置,以便它指向下一個long變量。編譯器知道這一點,并相應(yīng)地修改了指針的值。

當(dāng)您向指針添加數(shù)字或從指針減去數(shù)字時,也會發(fā)生同樣的事情。指針中存儲的地址不一定會增加或減少該數(shù)字。相反,它將增加或減少該數(shù)字乘以指針數(shù)據(jù)類型的字節(jié)大小。
指針和數(shù)組
指針和數(shù)組密切相關(guān)。聲明數(shù)組時,實際上是在創(chuàng)建一個常量指針,該常量指針始終保存數(shù)組的起始地址,并且我們用來訪問數(shù)組元素的索引符號也可以與指針一起使用。
例如,假設(shè)您有一個名為TxBuffer的char指針,該指針當(dāng)前保存地址0x30。以下代碼片段顯示了兩種等效的訪問地址0x31處數(shù)據(jù)的方式。
TxByte = *(TxBuffer + 1); TxByte = TxBuffer[1];
復(fù)制代碼
何時使用指針
在本節(jié)中,我想簡要討論兩種編碼情況,它們可以受益于指針的使用,并且與嵌入式應(yīng)用程序特別相關(guān)。
指針與數(shù)組
從上一節(jié)的討論中可以很自然地得出第一個。指針提供了另一種處理以數(shù)組形式存儲的數(shù)據(jù)的方法。在給定例程的上下文中,指針方法可能更直觀或更方便。
但是,在某些情況下,基于指針的實現(xiàn)可以提高代碼速度。我的理解是,在編譯器高度復(fù)雜并且能夠進行如此廣泛的優(yōu)化之前,這在過去更為正確。不過,在嵌入式開發(fā)的背景下,我認為在某些情況下指針可以提供不可忽略的執(zhí)行速度改進。如果您確實試圖達到執(zhí)行給定代碼部分所需的最小時鐘周期數(shù),那么值得嘗試一下指針。
將指針傳遞給函數(shù)
功能的廣泛使用可幫助您編寫井井有條的模塊化代碼。這是一件好事,盡管C施加了在某些情況下可能很尷尬的限制:一個函數(shù)只能有一個返回值。換句話說,它只能修改一個變量,除非使用指針。
此技術(shù)的工作原理如下:
包括一個指針作為該函數(shù)的輸入之一。
使用&運算符將變量的地址傳遞給函數(shù)。
在函數(shù)內(nèi)部,變量的地址成為指針的值,并且函數(shù)使用解引用運算符修改原始變量的值。
即使原始變量沒有直接通過返回值進行修改,該函數(shù)之后的代碼也假定該變量的值已被修改。
這是一個例子:
#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)在對C語言固件中的指針以及如何開始使用它們有一個清晰的了解。
-
C語言
+關(guān)注
關(guān)注
183文章
7646瀏覽量
146202
原文標(biāo)題:如何在C語言固件中使用指針
文章出處:【微信號:A1411464185,微信公眾號:multisim】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
C++ 11 14 17 20內(nèi)存管理-指針、智能指針和內(nèi)存池基礎(chǔ)與提升
指針與函數(shù)詳解
C語言重點—指針篇
函數(shù)指針與回調(diào)函數(shù)解讀
請教一個C語言的指針問題,求解答
C語言指針p、*p、&p、*&p、&*p分別代表什么
C語言主要特點
C語言函數(shù)指針的六個高級的應(yīng)用場景
C語言回調(diào)函數(shù)原來這么簡單
請問如何實現(xiàn)C語言訪問MCU寄存器?
Typedef在C語言中的應(yīng)用
函數(shù)指針及指針函數(shù)的區(qū)別
C語言特性
錫膏的儲存及使用方法詳解
C語言固件中指針的使用方法
評論