第二電腦網導讀:記憶體單元想像成一個個“郵箱”,而記憶體單元的資料就好比是“郵箱中的信件”,記憶體單元的編號(地址)就好比是“郵箱的編號”。 (插一小段,耐煩的看,不耐煩的跳過:如果在程式中定義一個變數,那麼編譯是系統就會為變數分配一定數量的記憶體單元。一般系統會為字元型的變數分配1個位元組的儲存空間,為整型變數分配2個位元組的儲存空間,浮點型的4個位元組)
本文:
圖中描述了6個記憶體單元,它們的編號分別是從1000到1005的6個值,其中編號1000到1005就是相應的記憶體單元的地址。
資料存放在地址所標識的記憶體單元中。地址1000到1005多對應的記憶體單元就是用來存放資料的。
繼續:把記憶體單元想像成一個個“郵箱”,而記憶體單元的資料就好比是“郵箱中的信件”,記憶體單元的編號(地址)就好比是“郵箱的編號”。
(插一小段,耐煩的看,不耐煩的跳過:如果在程式中定義一個變數,那麼編譯是系統就會為變數分配一定數量的記憶體單元。一般系統會為字元型的變數分配1個位元組的儲存空間,為整型變數分配2個位元組的儲存空間,浮點型的4個位元組)
總結:1`地址起到一個指向作用。2`地址中還隱含有這個變數的類型資訊。
其實,“指標”就是“地址”。通過“指標”可以找到以它為地址的記憶體單元。一個變數的地址稱為該變數的指標。
超級大推理:
——中心:一個變數的地址(指標)也是一個值。
→專門用來存放變數地址的變數,稱為“指標變數”。
→所以“指標變數”的值是“指標”(一個變數的地址)。
指標的運算:指標就地址。C語言中的地址是無符整數。
對於指標變數,允許的主要運算有:1`指標變數的賦值。2`指標與整數之間的加減運算。3`指標之間的比較。4`指標之間的加減運算。
呵呵```不知寫得好不好。如果大家支援,我將寫續集,下一集應該是寫“指標與一維數組”吧。呵呵```
附:回帖是一種美德。向回帖的同志致敬!
=================================================================================
精彩回複 作者:福爾摩斯
形象的說,大家都知道“郵箱”與“郵箱裡的信件”的關係吧!其實就是“地址”(指標)與“地址的內容”(指標指向的內容)的關係!
指標的概念更像一個郵遞員!
至於老K說的:指標不是地址,指什變數的值是一個地址.
解釋下:
大家還記得高中數學中一個概念嗎:向量(物理稱 向量)
向量有雙要素:方向 和 模長
同樣,指標 是 向量 的電腦化(就像是 數組 是 數列 的電腦化一樣)
當定義一個 指標變數 的時候,電腦分配給它空間,用這個空間來存放地址
我們把一個值賦給一個變數,那麼這個空間存放的值就是這個變數的值
同樣道理,我們把一個地址(無符號整型)賦給一個指標變數,那麼這個空間存放的地址就是這個指標變數的值
而這個概念就是 方向 !
而模長的概念就是 *p !
也許還有人聽不明白,我用C語言程式來說明:
我們常常利用 指標 來改變被傳遞到自訂函數的值(實參),讓 改變的值 返回主函數!
而這個 改變的值 是指標所指向的 地址上 的 改變的值 (紅色部分代碼)
而 不是 改變了 指標的指向 (藍色部分代碼)!
#include<stdio.h>
int main()
{
int *p,*q,a=1,b=2;
int change(int *,int *);
p=&a;q=&b;
change(p,q);
printf("%d,%dn",*p,*q);
getch();
return 0;
}
int change(int *x,int *y)
{
int *z;
z=x;x=y;y=z;//這裡改變了指標的地址,但是結果卻沒有改變,因為指標的值是地址,是不會被傳遞迴主函數的
}
PS:
int change(int *x,int *y)
{
int z;
z=*x;*x=*y;*y=z;//它改變了指標所指向的值,但是沒有改變指標的地址!
}
注意藍色部分如果把 *z 改成 z (或者紅色部分 z 改成 *z )都是不可以的!
因為int *z;那麼z的空間就是用來存放地址,雖然你也可以認為這樣可以傳遞,但是如果是聰明的編譯器就會警告,不聰明的編譯器就會報錯
所以還是請大家規範書寫!
來源:http://www.002pc.com/master/College/Language/VC/2010-04-27/13779.html