知識點回顧
1. const 關鍵字
在 c 語言中,有一種能力可以將變數變成具有常量一樣的特性。這就是 —— const 關鍵字。
在它的修飾下,變數就會失去可修改的特性,也就是變成唯讀的屬性。
const int price = 520;
const char a = 'a';
const float pi = 3.14;
2. 指向常量的指標
萬能的指標當然也可以指向被 const 修飾過的變數,這就意味著不能通過指標來修改它所引用的值。
這時候,如果嘗試修改指標引用的值,那麼我們將被告知程式無法通過編譯;但如果只是修改指標的指向,那麼編譯器並不會阻止你這麼做。
#include int main(void)
這樣編譯器會報錯, [error] assignment of read-only location 『* pc』 但是你可以這樣修改
pc = #
總結:
指標可以修改為指向不同的常量
指標可以修改為指向不同的變數
可以通過解引用來讀取指標指向的資料
不可以通過解引用修改指標指向的資料
指向非常量的常量指標
指向常量的指標,不能改變的是指標指向的值,但指標本身是可以被修改的。如果要讓指標也不可變,那麼可以使用常量指標。
同樣是使用 const 關鍵字修飾即可,只是位置稍微發生了變化:
#include int main(void)
它有如下特性:
指標自身不可以被修改
指標指向的值可以被修改
指向常量的常量指標
就是在剛才的基礎上進一步限制,讓常量指標指向的值也是常量:
#include int main()
這樣指標自身不能被改變,它所指向的資料也不能通過對指標進行解引用來修改。其實這種霸氣十足的限制在平時很少派上用場啦。並且我們發現——如果初始化時,指向的物件不是 const 修飾的變數,那麼我們仍然可以通過變數名直接修改它的值:
#include int main()
總結:
指標自身不可以被修改
指標指向的值也不可以被修改
指向「指向常量的常量指標」的指標
標題看起來似乎挺恐怖的,但其實你只要仔細思考,就不難發現:關於指標的那點事兒,永遠都是換湯不換藥的把戲
#include int main()
const 修飾的唯讀變數必須在定義的同時初始化,想想為什麼?
答:定義的時候不初始化的話,後面不能為其賦值,也就不發使用了。
因為 const 修飾的變數具有唯讀的特性,一旦生成變無法被改變,所以如果沒有在定義的時候對它進行初始化,那它就失去了存在的意義
請問 const int *a; 和 int const *a; 兩種寫法表示的含義一樣嗎?
答:一樣;
因為沒有用 const 修飾 * 這樣的解釋,所以這兩種寫法表示的含義其實是一樣的,都是表示 const int * a;(乙個指向 const int 型別的指標)。a 所指向的記憶體單元為唯讀,所以 (*a)++ 是不允許的;但指標 a 本身可以修改,即 a++ 是允許的。
錯誤**
……
const int num = 520;
int *p = #
……
答:只有 a 是錯誤的做法!在賦值、初始化或引數傳參的過程中,賦值號左邊的型別應該比右邊的型別限定更為嚴格,或至少是同樣嚴格。在 a 中,使用指標 p,就可能間接地繞過 const 設定的防線
請問下邊**為什麼在小甲魚的編譯系統中不能通過編譯?如果不改變 p 變數的型別,應該如何改正?
#include int main()
答:因為 void 指標是可以指向任何型別,所以從另乙個角度來看,void 指標「只儲存位址,而沒有記錄跨度。
應該將 p 先強制轉換成 int * 型別,再對其進行解引用:(強制型別轉換指標型別應該使用(int *))
#include int main()
請問下面**可以成功通過編譯並執行嗎?
#include int main()
答:此**不能通過編譯,見上面那題。
因為 const 其實只是對變數名(num)起到乙個限制作用,也就是說你不可以通過這個變數名(num)修改它所在的記憶體通過指標進行間接修改。但是,這並不是說這塊記憶體就不可以修改了,如果你可以通過其他形式訪問到這塊記憶體,還是可以進行修改的。所以,儘管編譯器發現苗頭不對,但它也只能義務地提醒你而已。
請問在下邊宣告中,const 限制的是 q、*q 還是 **q?
#include int main(void)
答:const 限制的是 *q 和 **q。
分析:千萬不要給亂七八糟的 const 給弄暈了,記住一點:const 永遠限制緊隨著它的識別符號。const int * const *q = &p; 相當於 (const int) * (const *q) = &p;,即第乙個 const 限制的是 **q 的指向,第二個 const 限制的是 *q 的指向,唯有乙個漏網之魚 —— q 沒有被限制。
接上題,如果想要使用 const 同時限制 q、*q 和 **q,應該怎麼做?.
答:宣告應該寫成:const int * const * const q = &p;
請問 const int * const *q; 和 cosnt int const **q; 有何區別?
答:const int * const *q; 限制了 *q 和 **q 的指向,而 cosnt int const **q; 只限制了 **q 的指向。
動動手
請編寫乙個程式,測試一下你當前的計算機是大端還是小端?
#include int main(void)
else
printf("0x12345678 在記憶體中依次存放為:0x%x 0x%x 0x%x 0x%x\n", p[0], p[1], p[2], p[3]);
return 0;
}
《帶你學C帶你飛學習筆記》 SE28函式初體驗
請按順序標示出指定語句的執行順序 如 a b c d include void a void b void c void a int main void c void b 答 執行順序b f c a d e。請指出下面定義 錯的地方 有5處錯誤 include void func int main ...
帶你學C帶你飛
阿里雲大學 帶你學c帶你飛 帶你學c帶你飛 第一季講解內容 c語言語法,我們會講變數 陣列 函式 指標 結構 標準庫這樣一些純粹的c語言知識。基本上你大學第一學期學的就是咱第一季的內容,我知道很多朋友學完c語言一時感覺沒什麼用?然後大一學完大二就還給體育老師了 咳咳,畢竟現在是乙個連程式都要刷顏值的...
《帶你學C帶你飛》 SE61 IO緩衝區
最後一節 include include int main void fputs i love you n fp 至此fputs寫入的東西是放在io緩衝區的,並沒有寫入到檔案中去 getchar 阻塞函式,知道函式呼叫才會結束程式 fclose fp 不輸入字元,不會到這一步。等輸入任意字元,關閉檔...