& 是取地址運算符,* 叫做指針運算符或間接運算符。&a 的運算結果是一個指針,指針的類型是a的類型加上*,指針所指向的類型是a的類型,指針的值也就是指針所指向的內存區就是a的地址。 *p的運算結果就多了,總之,*p的結果是p所指向的東西,這個東西有這些特點: 它的類型是p所指向的類型,它所占用的地址是p所指向的地址。
看下面的例子:
int a = 5;
int b;
int *p;
int **q;
p = &a; //&a的結果是一個指針,類型為int*,指向的類型為int,指向的地址是a的地址。
*p = 10; //*p的結果,在這裡它的類型是int,它所占用的地址就是p所指向的地址,也就是a的地址。顯然這裡的*p就是變量a,這句代碼的實質就是為a重新賦值。
q = &p; //&p的結果是一個指針,類型為p的類型加上*,在這裡是int **。該指針所指向的類型為p的類型,這裡就是int*。該指針所指向的地址就是指針p的地址。
*q = &b; // *q是一個指針,&b的結果也就是個指針,且這兩個指針的類型和所指向的類型是一樣的,所以這句代碼的意思就是為*q賦值。
**q = 34; // *q的結果是q所指向的東西,在這裡是一個指針即int*,而對這個指針再做一次*運算,結果就是一個int型的變量了,它所占用的地址就是*q所指向的地址,也就是b的地址,所以這句的目的就是給變量b賦值。
最後,可以驗證下:
#include結果:int main(){ int a = 5; int b; int *p; int **q; printf("a = %d\n",a); p = &a; *p = 10; printf("a = %d\n",a); q = &p; *q = &b; **q = 34; printf("b = %d\n",b); }
a = 5 a = 10 b = 34