通過變數名訪問變數,稱為直接訪問;
通過指標方式訪問,稱為間接訪問;
變數名是為了方便程式設計師使用而定義的,
記憶體存放資料的真相
指標就是位址的意思
指標變數是用來的存放位址的變數。普通的變數中存放的是資料,指標變數中存放的是位址;
假設定義兩個指標變數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
答:都正確。5. 你覺得將取址運算子(&)作用於乙個常數,然後試圖列印該常數在記憶體中的位址,這樣做可取嗎?記憶體中存放值不是0就是1,如何解釋,需要看定義。如果你看不到定義(你在逆向破解乙個程式),那麼為了判斷值的型別,你必須觀察程式中這個值的使用方式(如果使用整型算術指令,這個值就被解釋為整數;如果使用浮點型指令,它就是浮點數)。
答:不可以,因為取址操作符(&)的作用物件應該是乙個左值,而常數是右值。簡單區分,左值是必須可以改變的。6 請問下邊**是否可以成功執行呢?為什麼?
#include int main()
這種做法編譯器並不會認可,編譯不通過,它會毫不猶豫給你直接報錯!
7. 請問為什麼每次執行下邊**都會得到不同的結果?
#include int main()
答:這裡我們宣告了乙個指標變數 a,但並未對它進行初始化,這是非常危險的行為!因為我們沒辦法**這個指標變數的值會被初始化為什麼,它只是恰好記憶體中存在的「隨機值」8. 請問下邊**執行後,印表機的結果是什麼?另外,*b 是左值(l-value)還是右值(r-value)?
#include int main()
答:列印結果:a = 100★finished by songpl, 2018.12.2第乙個問題:定義指標變數 b 的時候,存放的是變數 a 的位址。在此之後,*b 即對變數 a 的間接訪問(通過位址訪問 a 變數)。所以 *b = *b - 10; 相當於 a = a - 10; 也就是說,通過指針對乙個變數間接訪問,你可以理解為把它作為那個變數本身使喚(即 *b == a)
第二個問題:指標變數 b 既是左值,也是右值。看 *b = *b - 10; 這個語句,賦值號右邊,*b 間接訪問變數 a 的值,因為用的是它的值,所以是右值;賦值號左邊,*b 用於定位變數 a 的儲存位置,然後將右邊表示式的值存放進去,所以此時為左值
《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...