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

Ubuntu 12.04 LTS 在當前目錄開啟終端機




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

廢話已自動省略

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


  1. 先開啟終端機
  2. 在終端輸入

    ln -s /usr/bin/gnome-terminal /home/使用者名稱/terminal
  3. 回到家目錄, 找到 "terminal" 可執行二進位程式的捷徑, 剪下貼上到你想要開啟終端的地方, 開啟捷徑, 然後就是你要的結果了

Compile C code for arm Android using Ubuntu 12.04 LTS




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

廢話已自動省略

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



一.安裝作業系統 Ubuntu 12.04 LTS


 Download Links :

 32 byte:

 64 byte:

 如果安裝的時候顯示你的 CPU 不支援此核心, 請安裝  non-pae  版



二.安裝 gcc-arm-linux-gnueabi 跨平台編譯器


 打開你的終端, 輸入以下指令 :


 sudo apt-get install gcc-arm-linux-gnueabi
 sudo apt-get install gcc-arm-linux-gnueabihf



三.寫一隻 Hello World 程式


 #include <stdio.h>
 int main (void)
 {
   printf("Hello World !");
   return 0;
 } 

 存檔 :  /home/使用者名稱/helloworld.c




四.編譯程式碼


 打開終端機, 輸入  :

 arm-linux-gnueabi-gcc -static -march=armv7 -O3 /home/使用者名稱/helloworld.c -o helloworld



五.執行


 1.把編譯出來的helloworld可執行檔複製到手機根目錄

  這裡有我編譯出來的範例檔:helloworld

 2.去 google play store 下載"模擬終端" (Terminal Emulator)


 3.執行 Terminal Emulator


 4.輸入指令如下 :

  su
  chmod 0755 helloworld
  ./helloworld

如果你得到的結果是 Hello World ! 那就代表你成功了!!!












                                monitorstudio 130825