首頁>Club>
舉例說明一下在什麼情況下會用到指標。
4
回覆列表
  • 1 # 雁塔菜農

    C語言的指標主要分兩類,即資料指標(包括結構指標等)和函式指標(子程式散轉入口地址)。

    C語言的指標說白了就是資料或函式的地址。

    它比一般的存取和訪問速度要慢一些,彙編程式碼要長很多。

    在嵌入式領域的程式設計中,中斷向量表實際就是函式指標表或著可稱為函式指標陣列。

    在對付反彙編方面,用指標而不是直接定址將會有效或加大難度地阻止反彙編,即反逆向或反破解。

    但是在嵌入式實際應用中,因為函式指標可能是動態的即在RAM記憶體中,故可能會造成函式指標被幹擾即指標被破壞,這樣程式會跑飛,造成宕機或看門狗復位被熱啟動。

    而中斷向量表是放在ROM區的,即const(code)型別。

    一般人都很頭疼指標,實際上並不難,它就是地址而已。

  • 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++利用指標和虛擬函式實現動態多型。

  • 中秋節和大豐收的關聯?
  • 有哪些好看的國產動漫?