標籤:運算子和
本文是自己學習所做筆記,歡迎轉載,但請註明出處:http://blog.csdn.net/jesson20121020
& 是取地址運算子,* 叫做指標運算子或間接運算子。&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 <stdio.h>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 = 5a = 10b = 34
總之,要理解這兩個運算子,需要把握住兩個運算的結果的類型和所指向的類型。
C指標解析 ------ 運算子&和*