三言兩語說"指針"

第二電腦網導讀:內存單元想像成一個個“郵箱”,而內存單元的數據就好比是“郵箱中的信件”,內存單元的編號(地址)就好比是“郵箱的編號”。  (插一小段,耐煩的看,不耐煩的跳過:如果在程序中定義一個變量,那麼編譯是系統就會爲變量分配一定數量的內存單元。一般系統會爲字符型的變量分配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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章