1. 程式人生 > >嵌入式學習之C語言運算子加減舉例

嵌入式學習之C語言運算子加減舉例

C語言運算子加減舉例

指標運算子加減舉例

測試程式碼如下

首先定義了兩個十六進位制的int型別的變數,將變數b的地址賦給了p1,將b的變數中的四個位元組取小地址的位元組(指向99的位元組)賦給了char型別的指標p2,我們前面在進行不同型別的賦值的時候是有警告的,有些編譯器直接會報錯,編譯通不過的。這裡我們進行了強制型別的轉換,就告訴了編譯器,這個不同型別的賦值我們作為程式設計師是故意而為之的,編譯器就不會再對這裡報錯了。

執行結果如下:q

如果我們對*p1進行輸出,結果應該是99991199,但是我們對*(p1+1)和p1[1]進行輸出的時候,結果卻是a變數的值。我們可以想到指標變數p1的地址向後移動了一個int型別的位元組數(關於兩個變數在記憶體中的儲存方向在編譯原理中會講到),就到了a變數的地址。至於*p1+1就是將p1指向的值99991199取出來再加一,顯然結果也是正確的。在第一個章節的時候,我們就知道一個int型別四個位元組的儲存方式,它指向的是0x99(末尾不是開頭),再移動一個就是儲存的0x11,顯然結果是正確的。

通過這個例子,我們明白了指標的加減運算就是地址的偏移,指標變數的型別決定一個單位的偏移大小。C語言強大的指標訪問功能可以將整個記憶體切割成許多的標籤,你可以通過一個指標訪問到整個記憶體,比如p[10000],雖然這已經是越界訪問了。如果我們知道某一個記憶體地址裡面存放的是你在玩遊戲時的角色的血量,你通過指標去修改這個值變為很大,那你就在遊戲中無敵了。從語法角度來講,越界是允許的,C語言不會關心你越界的問題,C的目的就是將記憶體標籤化。但是我們作為程式設計師,使用指標的標籤訪問的時候一定要考慮它的範圍大小。這也是後面我們在講到記憶體分配和函式呼叫的時候的要介紹的,定義指標的時候我們就需要定義它的重要的屬性-大小。沒有大小我們就可以任意訪問,任意訪問就可能出現系統記憶體洩漏。

當我們將上面的p1[1]改成p1[10000],編譯的時候沒有報錯,但是執行的時候就報出了一個段錯誤;p1[1]改成p1[100]之後,讀取了一個值,顯然這個記憶體是可以可讀取的。這就是指標越界訪問的強大。