回覆列表
-
1 # 使用者4469785837472
-
2 # 使用者2226384485603
這是典型的c語言指標題
int *a表示定義了一個int型的指標
*a=b表示指標a指向b,即把b賦值給*a;
&是取地址符,&b代表b在記憶體中的地址,*a=&b表示把b的地址賦值給*a。
利用編譯器編譯該程式碼:
結果為:
拓展資料
*和&運算
(*p)操作是這樣一種運算,返回p 的值作為地址的那個空間的取值。(&p)則是這樣一種運算,返回當時宣告p 時開闢的地址。顯然可以用賦值語句對記憶體地址賦值。我們假設有這麼兩段記憶體地址空間,他們取值如下:(單位:H,16 進位制)
假設有這麼一段程式碼:(假設開闢空間時p 被分配給了3001H、3002H 兩個位置)
int *p;
p=2003H;
*p=3000H
**p的值為多少?
**p=*(*(p))=*(*(2003H))=*(3000H)=3000H。
那麼&&p、*(&p)和&(*p)又等於多少?
&&p=&(&(p))=&(3001H),此時出錯了,3001H 是個常數怎麼可能有地址呢?
*&p=*(&(p))=*(3001H)=2003H,也就是*&p=p。
資料來自於:
當然不是這樣。在c語言中,&&的優先順序比||高,所以當這兩個一起出現的時候,是先算&&再算||,當然,||在c語言也有個陷阱。就是當||的前半部分為真的時候,就不執行後半部,只有前半部分為假的時候才執行後半部分。本題中:a=b=c=1; 於是a,b,c的值都是1,++a||++b&&++c; 中,&&的優先順序高,所以先算++b&&++c, 再跟++a做||運算。於是++a是||的前半部分。而++a的值此時是2,a的值就是2,即為真。於是就不做後半部分的運算。也就沒有++b&&++c的運算。於是b,c的值還是都為1.這下明名為什麼是a=2 b=1 c=1,而不是a,b,c都為2的原因了吧。