-
1 # 雁塔菜農
-
2 # 跟我學微控制器
作為一名長期使用C語言進行開發的老司機,我來回答一下C語言指標的問題。
首先、C語言指標的本質是什麼?C語言指標的本質是記憶體變數,是記憶體單元的編號。記憶體單元是以位元組為單位的。所以指標就是位元組的編號。如下圖所示,一個4G記憶體的編號,指標的值其實就是記憶體編號。
其次、搞清楚變數和指標的關係變數對應的是具體的記憶體,變數的內容就是記憶體中儲存的資料。
比如,我們定義一個變數uint8_t a=10,假如a的位置是0,也就是上圖中0位置的記憶體中儲存的資料是10;
我們再來看指標,定義指標uint8_t * b=&a,我們知道&的含義是取地址,那麼根據上面的假設變數a位於地址0,那麼&a也就是0,此時指標變數b的值也就是0.
如果不好理解指標定義uint8_t * b=&a,我們可以變通一下:
(uint8_t *) b =&a,把(uint8_t *) 當做一個新的資料型別就好理解了,其實我們實際的程式設計中,也通常會這麼定義:typeof uint8_t * uint8_p
uint8_p b=&a;
這樣 b就更像是一個變量了,理解起來更容易了。
第三、指標單元和記憶體指標每個單元代表多少個記憶體呢?這要看指標的型別
比如,char * a,short int * b,int *c,long int * d等
指標所指的每份記憶體數量為1個位元組,2個位元組,4個位元組,8個位元組,也就是每個變數型別所佔的記憶體單元。
假設a、b、c、d四個指標變數值均為100,分別做自加運算後,指標的值是多少呢?
a++;
b++;
c++;
d++;
你能猜出,a、b、c、d的值分別是多少嗎?
答案是:101,102,104,108.
也就是每次指標移動一個變數型別對應的記憶體數,這個可以在keil 開發環境上面透過模擬環境驗證,有興趣的可以自行驗證一下。
最後、指標的優勢和應用場景優勢:1.效率高;2、靈活,可以訪問任意位置的記憶體資料;3、作為函式引數傳遞,只需要傳遞4個位元組,比陣列傳值節省記憶體複製時間。
應用場景:1.函式中交換兩個變數的值
在學習函式時,交換兩個數的值,做一個swap函式,傳遞值進去,也可以將兩個值交換過來,沒問題,可是離開swap就沒有用了,為什麼?因為傳進去的是兩個值。如果傳遞的是指標就沒有問題。因為指標傳遞過去的是兩個變數的地址,變數的位置不變。
2.函式透過指標返回多個值
3.函式返回運算的狀態,結果透過指標返回
…………
指標的弊端指標是C語言的靈魂所在,通常說C語言是“低階”語言的原因,很大程度上也是因為C語言指標的問題,C語言指標讓開發者可以訪問任意記憶體位置的資料。這是其他語音沒有辦法達到的。也正因為指標,C語言也很容易出錯,最常見的問題是地址越界,如果地址越界,讀寫了不該讀寫的內容會直接導致系統崩潰,而且這種問題很難定位,因為語法上是沒有錯誤的,編譯的時候無法檢查出來。
-
3 # 小智雅匯
1 函式之間利用指標引數共享記憶體單元。函式返回指標避免返回值的副本機制。
2 返回一塊堆記憶體實現動態陣列。
3 實現鏈式儲存,如連結串列內的結構體利用指標指向自己。
4 函式指標形成回撥。
5 C++利用指標和虛擬函式實現動態多型。
回覆列表
C語言的指標主要分兩類,即資料指標(包括結構指標等)和函式指標(子程式散轉入口地址)。
C語言的指標說白了就是資料或函式的地址。
它比一般的存取和訪問速度要慢一些,彙編程式碼要長很多。
在嵌入式領域的程式設計中,中斷向量表實際就是函式指標表或著可稱為函式指標陣列。
在對付反彙編方面,用指標而不是直接定址將會有效或加大難度地阻止反彙編,即反逆向或反破解。
但是在嵌入式實際應用中,因為函式指標可能是動態的即在RAM記憶體中,故可能會造成函式指標被幹擾即指標被破壞,這樣程式會跑飛,造成宕機或看門狗復位被熱啟動。
而中斷向量表是放在ROM區的,即const(code)型別。
一般人都很頭疼指標,實際上並不難,它就是地址而已。