三言兩語,妙說《指針》。

字號:

指針是什么?——指針是一種數(shù)據(jù)類型
     形象的說,大家都知道“郵箱”與“郵箱里的信件”的關(guān)系吧!其實就是“地址”(指針)與“地址的內(nèi)容”(指針指向的內(nèi)容)的關(guān)系!
     如圖:(耐煩的看,不耐煩的跳過)
     (自己畫的,有點粗糙,別怪我。)
    圖中描述了6個內(nèi)存單元,它們的編號分別是從1000到1005的6個值,其中編號1000到1005就是相應(yīng)的內(nèi)存單元的地址。
    數(shù)據(jù)存放在地址所標(biāo)識的內(nèi)存單元中。地址1000到1005多對應(yīng)的內(nèi)存單元就是用來存放數(shù)據(jù)的。
     繼續(xù):把內(nèi)存單元想像成一個個“郵箱”,而內(nèi)存單元的數(shù)據(jù)就好比是“郵箱中的信件”,內(nèi)存單元的編號(地址)就好比是“郵箱的編號”。
     (插一小段,耐煩的看,不耐煩的跳過:如果在程序中定義一個變量,那么編譯是系統(tǒng)就會為變量分配一定數(shù)量的內(nèi)存單元。一般系統(tǒng)會為字符型的變量分配1個字節(jié)的儲存空間,為整型變量分配2個字節(jié)的儲存空間,浮點型的4個字節(jié))
     總結(jié):1`地址起到一個指向作用。2`地址中還隱含有這個變量的類型信息。
     其實,“指針”就是“地址”。通過“指針”可以找到以它為地址的內(nèi)存單元。一個變量的地址稱為該變量的指針。
     超級大推理:
     ——中心:一個變量的地址(指針)也是一個值。
     →專門用來存放變量地址的變量,稱為“指針變量”。
     →所以“指針變量”的值是“指針”(一個變量的地址)。
    指針的運算:指針就地址。C語言中的地址是無符整數(shù)。
    對于指針變量,允許的主要運算有:1`指針變量的賦值。2`指針與整數(shù)之間的加減運算。3`指針之間的比較。4`指針之間的加減運算。
    =================================================================================
    形象的說,大家都知道“郵箱”與“郵箱里的信件”的關(guān)系吧!其實就是“地址”(指針)與“地址的內(nèi)容”(指針指向的內(nèi)容)的關(guān)系!
    指針的概念更像一個郵遞員!
    至于老K說的:指針不是地址,指什變量的值是一個地址.
    解釋下:
    大家還記得高中數(shù)學(xué)中一個概念嗎:向量(物理稱 矢量)
    向量有雙要素:方向 和 模長
    同樣,指針 是 向量 的計算機化(就像是 數(shù)組 是 數(shù)列 的計算機化一樣)
    當(dāng)定義一個 指針變量 的時候,計算機分配給它空間,用這個空間來存放地址
    我們把一個值賦給一個變量,那么這個空間存放的值就是這個變量的值
    同樣道理,我們把一個地址(無符號整型)賦給一個指針變量,那么這個空間存放的地址就是這個指針變量的值
    而這個概念就是 方向 !
    而模長的概念就是 *p !
    也許還有人聽不明白,我用C語言程序來說明:
    我們常常利用 指針 來改變被傳遞到自定義函數(shù)的值(實參),讓 改變的值 返回主函數(shù)!
    而這個 改變的值 是指針?biāo)赶虻?地址上 的 改變的值 (紅色部分代碼)
    而 不是 改變了 指針的指向 (藍色部分代碼)!
    #include
    int main()
    {
     int *p,*q,a=1,b=2;
     int change(int *,int *);
     p=&a;q=&b;
     change(p,q);
     printf("%d,%d\n",*p,*q);
     getch();
     return 0;
    }
    int change(int *x,int *y)
    {
     int *z;
     z=x;x=y;y=z;//這里改變了指針的地址,但是結(jié)果卻沒有改變,因為指針的值是地址,是不會被傳遞回主函數(shù)的
    }
    PS:
    int change(int *x,int *y)
    {
     int z;
     z=*x;*x=*y;*y=z;//它改變了指針?biāo)赶虻闹?,但是沒有改變指針的地址!
    }
    注意藍色部分如果把 *z 改成 z (或者紅色部分 z 改成 *z )都是不可以的!
    因為int *z;那么z的空間就是用來存放地址,雖然你也可以認為這樣可以傳遞,但是如果是聰明的編譯器就會警告,不聰明的編譯器就會報錯
    所以還是請大家規(guī)范書寫!