C語言補漏 指標

2021-09-05 11:45:11 字數 2839 閱讀 5653

通過變數名訪問變數,稱為直接訪問;

通過指標方式訪問,稱為間接訪問;

變數名是為了方便程式設計師使用而定義的,

記憶體存放資料的真相

指標就是位址的意思

指標變數是用來的存放位址的變數。普通的變數中存放的是資料,指標變數中存放的是位址;

假設定義兩個指標變數pa和pf,指標變數在記憶體中,佔4個位元組。

型別名 *指標變數名

char *pa;//定義乙個指向字元型的指標變數

int *pb;//定義乙個指向整型的指標變數

獲取某個變數的位址,使用取位址運算子(&)

char *pa = &a;

char *pb = &f;

訪問指標變數指向的資料,使用取值運算子(*)

printf("%c,%d\n",*pa,*pb);
注意:在定義指標變數和取值時使用的是同乙個符號,這是資料符號的重用,在不同的場合具有不同的作用;

在定義的時候,表示定義乙個指標變數;

在其他地方,表示取指標變數指向的那個變數的值;通過指標方式訪問,稱為間接訪問,所以,「*」也成為間接運算子;

簡單的例子回顧

#includeint main()

執行結果:

a = f

f = 123

the addr of a = 000000791a1bfc54

the addr of f = 000000791a1bfc74

the addr of pa = 000000791a1bfc98

請按任意鍵繼續. . .

如下

#include int main()

報錯!!!

小甲魚的《帶你學c帶你飛課後題》

0. 通常程式猿口中的「指標」,指的是什麼東西?

1. 指標變數只能存放位址嗎?

2. 請問 int * a, b, c; 定義了多少個指標變數?

答:乙個。只有a是指標變數,其他的都是普通的變數。

3. 請問 int *(a, b, c); 定義了多少個指標變數?

答:這句話是有語法錯誤,定義三個指標變數應該: int *a,*b,*c;

4. 在記憶體中捕獲到一組 32 位資料如下:

0110 0111 0110 1100 0110 1111 0110 0010

請問它的值可能是(多選,可借助計算工具):

a. 1 個 32 位整數:1735159650

b. 2 個 16 位整數:26476 和 28514

c. 4 個字元:glob

d. 浮點數:1.116533 * 10^24

答:都正確。

記憶體中存放值不是0就是1,如何解釋,需要看定義。如果你看不到定義(你在逆向破解乙個程式),那麼為了判斷值的型別,你必須觀察程式中這個值的使用方式(如果使用整型算術指令,這個值就被解釋為整數;如果使用浮點型指令,它就是浮點數)。

5. 你覺得將取址運算子(&)作用於乙個常數,然後試圖列印該常數在記憶體中的位址,這樣做可取嗎?

答:不可以,因為取址操作符(&)的作用物件應該是乙個左值,而常數是右值。簡單區分,左值是必須可以改變的。

6 請問下邊**是否可以成功執行呢?為什麼?

#include int main()

這種做法編譯器並不會認可,編譯不通過,它會毫不猶豫給你直接報錯!

7. 請問為什麼每次執行下邊**都會得到不同的結果?

#include int main()

答:這裡我們宣告了乙個指標變數 a,但並未對它進行初始化,這是非常危險的行為!因為我們沒辦法**這個指標變數的值會被初始化為什麼,它只是恰好記憶體中存在的「隨機值」

8. 請問下邊**執行後,印表機的結果是什麼?另外,*b 是左值(l-value)還是右值(r-value)?

#include int main()

答:列印結果:a = 100

第乙個問題:定義指標變數 b 的時候,存放的是變數 a 的位址。在此之後,*b 即對變數 a 的間接訪問(通過位址訪問 a 變數)。所以 *b = *b - 10; 相當於 a = a - 10; 也就是說,通過指針對乙個變數間接訪問,你可以理解為把它作為那個變數本身使喚(即 *b == a)

第二個問題:指標變數 b 既是左值,也是右值。看 *b = *b - 10; 這個語句,賦值號右邊,*b 間接訪問變數 a 的值,因為用的是它的值,所以是右值;賦值號左邊,*b 用於定位變數 a 的儲存位置,然後將右邊表示式的值存放進去,所以此時為左值

★finished by songpl, 2018.12.2

《C和指標》 C語言補漏 指標篇

沒錯,對於指標,我確實只能摘取書上的少許內容,因為我在資料結構的時候已經弄明白了很多,所以這一部分並沒有仔細的看,還有後面的用 c語言實現抽象資料型別,資料結構裡也有講,所以我建議還是先看 c和指標 再去學資料結構。1.在宣告指標變數時,可以為它指定初始值,如 char message hello ...

C語言補漏 void指標和NULL指標

在定義變數時,變數的型別決定占用的記憶體大小 直接定義無型別的變數,編譯器是不能他通過的。如下。void a 編譯器報錯 void指標我們稱之為通用指標,也就是可以指向任意型別的資料。也就是說,任何型別的指標都可以賦值給void指標。測試一下 include int main 執行結果 pv 000...

c語言複習補漏

for迴圈的表示式的三個條件均可以不寫 一直列印hello for 常用庫函式 include 使用布林表示式時 include 使用數學公式時 include 使用字串函式時 include includevoid main 未知 實際輸出值為30 char c 14 等價a陣列 char d 1...