測試**如下
首先要知道的是,雙引號裡面的字串是常量型別的,在儲存字串的空間中,字串的每乙個位元組被展開儲存,按照『h』『e』『l』…來儲存。我們用char型別的指標指向了這一片區域,嚴格來說,它們的型別是不匹配的。在前面我們使用*p來訪問變數的值,但是在指向的是字串的時候,*p代表第乙個位元組所儲存的內容,並修改了這個字元的值。通過p來訪問這個字串全部的內容。
執行結果如下
可以看到第乙個字元的內容被顯示為h的ascii碼的數值,而修改常量字串的第乙個字元導致了乙個我們經常遇到的段錯誤(顯然不是最後輸出導致的,如果是輸出導致的,將會列印the),這就是指標指向的內容被非法訪問導致的段錯誤。不管你使用宣告方法,作業系統都會保證這個空間是不可寫的。所以雙引號裡面的字串我們應該理解為const char *。
測試**如下
由於陣列定義的時候就是乙個變數,所以我們可以通過指標修改它的值。
執行結果如下:
可以看到陣列的第乙個字元確實被我們修改了。
我們更明確的修飾了記憶體的屬性。
記憶體屬性
1)記憶體操作的大小: 由指標的型別來決定。
2)記憶體的變化性,可寫可讀。
如果記憶體的實現和我們定義的指標的型別不一樣,就很容易導致我們在實際操作中出現一些非法訪問的情況,最終出現段錯誤。所以我們在對指標進行定義的時候,一定要了解指標指向的這片記憶體真正的屬性是什麼。如果我們將剛才的字串常量賦值給乙個const char *p,顯然型別是一樣的,此時我們再對它的第乙個字元賦值操作的話,編譯器就會明確的給我們乙個警告而不是段錯誤了,如下:編譯器提示*p是乙個唯讀的值。我們使用char 型別的指標編譯的時候沒有報錯,在執行的時候卻會因為段錯誤而導致程式崩潰,這顯然比編譯器報錯糟糕多了。所以我們賦值的時候應該型別匹配。
我們可以通過下面的命令來檢視printf這個函式:
我們可以看到printf這個函式第乙個引數為乙個常量字串,所以我們在輸出操作的時候都是使用雙引號輸出。如果你想使用乙個非常量的字元指標也是可以的,反正它是不會修改字元的值的。
嵌入式學習(二) 嵌入式系統C 語言
1 從 cpu 復位時的指定位址開始執行 2 跳轉至彙編 startup 處執行 3 跳轉至使用者主程式 main 執行,在 main 中完成 a.初試化各硬體裝置 b.初始化各軟體模組 c.進入死迴圈 無限迴圈 d呼叫各模組的處理函式 下面是幾個 著名 的死迴圈 1 作業系統是死迴圈 2 win3...
嵌入式C語言設計學習之C語言回顧
c語言的結構還是以函式為主體,通過其他資源的新增來實現高階語言邏輯。所有的操作都是基於主函式展開的。以主函式為順序列表,其他函式作為功能模組,組成乙個完整的系統。所以,寫c語言就要先構建主函式,確定所需的功能,再利用各種變數的控制關係得到具體的功能。c語言的資料型別就是int,float,char等...
嵌入式C學習
靜態變數與靜態函式 extern變數 關鍵字const和巨集定義define 程式中所有數在計算機記憶體中都是以二進位制的形式儲存的。位運算就是直接對整數在記憶體中的二進位制位進行操作。常見的位運算有 and運算 or運算 xor運算 not運算 shl運算 和shr運算 and運算通常用於二進位制...