Translate

C語言徹底弄懂指標

昨天為了完成一隻程式,所以花了點時間搞懂了指標,相信你只要跟著我看,一定也可以瞬秒指標

因為指標是變數的產物,所以一定要先搞定變數才能學會指標
你一定會說變數那麼簡單誰不會? 可是它真的很重要
這裡把變數分出三個面向:
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;
}

在 Ubuntu 12.04 LTS 安裝 JDK



~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

廢話已自動省略

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~




su
mkdir /usr/lib/jvm
cp jdk.tar.gz /usr/lib/jvm
cd /usr/lib/jvm
tar -xzvf jdk.tar
rm jdk.tar
sudo gedit /etc/environment
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/lib/jvm/jdk1.7.0_25/bin"
CLASSPATH="/usr/lib/jvm/jdk1.7.0_25/lib"
JAVA_HOME="/usr/lib/jvm/jdk1.7.0_25"
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.7.0_25/bin/java 300
sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk1.7.0_25/bin/javac 300
sudo update-alternatives --config java