《帶你學C帶你飛學習筆記》 SE27常量和指標

2021-09-25 05:49:27 字數 3345 閱讀 1180

知識點回顧

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 不輸入字元,不會到這一步。等輸入任意字元,關閉檔...