嵌入式C語言記憶體操作之C語言指標修飾符

2021-08-27 04:08:57 字數 1675 閱讀 3490

在我們了解了指標的基本概念之後,接下來我們來看一下指標和c中給我們提供的關鍵字中的型別修飾符它們之間的關係。指標就是儲存位址的一種特殊變數。那這個變數跟我們的修飾符之間還有哪些更深層次的符號限制吶?我們在實際開發過程中,經常會運用修飾符,把指標的這種限制範圍更明確的告訴給使用者,通過不同修飾符告訴給使用者指標的具體屬性。

指標變數也是乙個變數,它可以改變儲存的位址,指向乙個地方再指向另外乙個地方;還可以改變指向位址的值;所以它可以有兩個地方的改變。為了更好的去修飾一些特殊型別的指標,c提供給了我們三個關鍵字來修飾指標變數:

const我們知道他是唯讀性質的關鍵字,const修飾的變數就不能改變,成了常量。

1)const char *p;//這兩種修飾方法是一樣的,我們經常使用這種方法。都是修飾的char字元,它代表的是字串的內容不可以更改。此時的指標依舊可以指向其它的記憶體,但是通過指標修改它指向的值就是不可以的了。

char const  *p;

2) char * const  p;//這兩種修飾方法是一樣的,我們經常使用這種方法。都是修飾的指標,它代表的是指標指向的位址不可以改變,而位址裡面的內容是可以改變的。

char * p const;

一般這種定義都是硬體資源的定義。比如顯示卡當中有一片快取,顯示卡製造的廠家已經為我們焊好了快取區域,我們如果需要操作這片快取,我們需要找到快取的位址,而這些位址是不可以改變的。這個固定位址就可以定義為不可改變位址的指標變數。

3) const char * const p; //指標的指向和指向的內容都不可以被改變。這個一般使用在rom空間中。

volatile就是防優化。volatile一般和硬體有關,指向硬體的內容可能我們需要不要讓編譯器去優化,每次都要讀取那裡的內容。比如我們在實際操作中有乙個鍵盤,我們檢視乙個按鍵是否被按下,就是通過讀取記憶體裡面關於按鍵狀態的高低電平來識別。那麼我們怎麼來讀取這乙個位裡面的狀態(0或1)?我們能夠訪問到最小的記憶體位址就是乙個位元組,而乙個位元組裡面有8個位。所以我們只能利用乙個undsigned char*型別的指標來讀取乙個位元組的內容,再通過位運算來獲取到其中的某一位判斷它的狀態。這就是我們在硬體操作-軟體操作於硬體的思路。這乙個位元組的內容是不是常量,它是由於硬體的狀態來決定的,裡面的內容可能被編譯器優化掉,便於我們讀寫操作。volatile主要與char *p結合。

volatile  char *p;

while( *p == 0x10 )  //我們可以假設它的狀態是值的改變,當按鍵按下的時候值就變成這樣,此時我們的迴圈體就是它執行的操作了。

***x;

typedef是乙個別名。在後期,我們需要指標可以指向所有的資源,有些資源型別的宣告和讀取是比較複雜的。也許我們看到指標的時候不能一眼就看出它的型別。比如下面這種指標使用方法:

int  (*p[10])(int ,void (*p)(int));

c語言不斷的在描述記憶體屬性,這些記憶體屬性可以是函式,陣列…..所以指標指向的型別是千奇百怪的。所以我們就採用typedef把這些宣告別名化。

char *name_t  :     //name_t是乙個指標,指向了乙個char型別的記憶體

typedef char *name_t;  // name_t是乙個指標型別的名稱,指向了乙個char型別的記憶體

name_t abc;  // abc 是乙個指標,指向了乙個char型別的記憶體

可以看到有了別名之後,我們可以簡化指標型別的宣告和讀取,這在我們後期學了函式之後,它的好處就體現出來了。

嵌入式C語言設計學習之C語言回顧

c語言的結構還是以函式為主體,通過其他資源的新增來實現高階語言邏輯。所有的操作都是基於主函式展開的。以主函式為順序列表,其他函式作為功能模組,組成乙個完整的系統。所以,寫c語言就要先構建主函式,確定所需的功能,再利用各種變數的控制關係得到具體的功能。c語言的資料型別就是int,float,char等...

嵌入式C語言總結

這幾天花了兩天時間看了一些嵌入式c語言方面的內容,以下是一些讀書筆記,記錄一下。1 不能有返回值 2 不能向isr 傳遞引數 3 isr盡可能的短 4 printf有重入問題 1 中斷服務程式isr 2 硬體初始化 1 某io 晶元被定為在 cpu的儲存空間而非 io空間,而且暫存器對應於某特定位址...

嵌入式c語言優化

一.演算法和資料結構優化 1.針對應用的演算法優化,比如,在音訊編譯碼中,用fft實現時頻變換。2.c語言級別的優化,如排序演算法的選擇。3.資料結構的選擇,如果需要隨機訪問,則盡量選擇陣列,如果需要隨機插入刪除,則可以選擇鍊錶。4.盡量用指標代替資料操作,大部分編譯對於指標會生成更小更快的 5.盡...