因為指標是變數的產物,所以一定要先搞定變數才能學會指標
你一定會說變數那麼簡單誰不會? 可是它真的很重要
這裡把變數分出三個面向:
1.變數的名稱
2.變數的值
3.變數的記憶體位址
指標本身是就是一個變數,而你可以把它想像成是另一個變數的捷徑
什麼意思?
就像 Linux 的 soft link 一樣,捷徑裡寫著另一個檔案的路徑,執行捷徑的時候會先讀取捷徑裡儲存的路徑,然後執行目標檔案
翻譯成 C 語言就是:『指標這個變數儲存的值(捷徑的內容),是一個變數的記憶體位址(是一個檔案的路徑)』
知道指標的內容之後,再來看看它的表示方法:
取一個變數的記憶體位址要用"&"
例如變數a的記憶體位址就是"&a"
所以int b = &a;,變數b的值就是變數a的記憶體位址
可是這樣b還不是指標,為什麼?指標是一個捷徑,而b還只是儲存了a的記憶體位址的檔案罷了,不能算是一個捷徑,你要告訴電腦b是個捷徑,不是檔案
要怎麼做到?
int *b = &a;
就可以了,用"*"就可以讓電腦知道b是一個指標,而不是普通的變數
這裡有幾個觀念:
1. int *b; //告訴電腦b是個指標
2. b = &a; //b儲存a的位址
3. b的值會等於a的記憶體位址
4. *b的值會等於a的值
從上面可以知道,"*"在做的事情就是取一個記憶體位址裡儲存的值
來看範例你就懂了
int a = 10; //宣告a並給與值
int *b; //宣告一個指標
b = &a; //把a的記憶體位址儲存在b裡面
printf("%d", b); //得到的結果會是a的記憶體位址
printf("%d", *b); //得到的結果會是10
而第二句和第三句可以合併成一句:
int *b = &a;
來整理一下:
1. *b: 捷徑 //因為*b是a的捷徑,所以*b的值等於a的值
2. b: 儲存檔案路徑的檔案
3. a: 就只是一個檔案
這下你懂
1. &
2. *
要怎麼用了吧!
接著你一定會問,在 b = &a 的情況下,b的存在當然可以理解,它告訴我們a的位址,但是既然*b的值完全等於a的值,那為什麼要有*b的存在?通通用a不是比較快?
它會存在還是有理由的啦!
來看看下面這個例子:
function swap() {
int s;
s = a;
a = b;
b = s;
}