1. 程式人生 > >c語言 指標變數的運算

c語言 指標變數的運算

指標變數儲存的是一個地址,本質上是一個整數,可以進行部分運算.例如加法、減法、比較等

 #include <stdio.h>

int main(){
    int a=10, *pa=&a, *paa=&a;
    double b=99.9 ,*pb=&b;
    char c='@',*pc=&c;

    //最初的值
    printf("&a=%#X, &b=%#X, &c=%#X\n",&a,&b,&c);
    printf("pa=%#X, pb=%#X, pc=%#X\n",pa,pb,pc);
    // 加法運算
    pa++; pb++;pc++;
    printf("pa=%#X, pb=%#X, pc=%#X\n",pa,pb,pc);
    // 減法運算
    pa-=2; pb-=2; pc-=2;
    printf("pa=%#X, pb=%#X, pc=%#X\n",pa,pb,pc);
    // 比較運算
    if(pa==paa){
       printf("%d\n",*paa);
    }else {
       printf("%d\n",*pa);
    }

    return 0;

}
執行結果:
&a=0XD6B3465C, &b=0XD6B34650, &c=0XD6B3464F
pa=0XD6B3465C, pb=0XD6B34650, pc=0XD6B3464F
加法
pa=0XD6B34660, pb=0XD6B34658, pc=0XD6B34650
減法
pa=0XD6B34658, pb=0XD6B34648, pc=0XD6B3464E
比較
4195925

從原始結果來看:pa、pb、pc每次加1,他們的地址分別增加4、8、1 ,正好是int、double、char型別的長度;減2時,地址分別是減少 8、16、2,正好是int、 double、char型別長度的2倍。

pa++;使得地址加4的話,正好能夠完全跳過整數a,指向它後面的記憶體,這樣才有意義。
如果pa++;地址加1的話,那麼pa指向就處於a的記憶體區域,這樣就是沒有實際意義的。

我們知道,陣列中的所有元素在記憶體中是連續排列的,如果一個指標指向了陣列中某個元素,那麼加1表示指向下一個元素,減1表示指向上一個元素,這樣指標的加減運算就具有了現實意義。

c語言並沒有規定變數的儲存方式,如果連續定義多個變數,他們可能是挨著的,也有可能是分散的,這取決於變數的型別、編譯器的實現以及具體的編譯模式,所以對於指向普通變數的指標,我們往往不進行加減運算,雖然編譯器不保錯,但是沒有實際意義。

指標變數除了可以參與加減運算,還可以參與比較運算。當對指標變數進行比較運算時,比較的是指標變數本身的值,也就是資料的地址。如果地址相等,那麼兩個指標指向同一份資料,否則就指向不同的資料。例子中指標指向不同地址,因此是不同資料。

不能對指標進行乘法、取餘、除法等其他運算,除了傳送語法錯誤,沒有實際意義。

學習:http://c.biancheng.net/cpp/html/75.html