2 回答

TA貢獻50條經驗 獲得超11個贊
p是地址 *p的*是取出p地址中存放的值的符號剛開始把 數組a的數組名(數組名a是一個地址常量)賦給變量p(這里的p是存放地址的變量) p++就是讓p里面的地址變成下一個元素的地址,其他運算符 +、-之類的都同理,試一下就知道了?

TA貢獻883條經驗 獲得超454個贊
在定義變量時,變量名前面的*號代表這個變量是指針:
int *p=a ?這樣p是一個指向int的指針,并且被初始化為指向a數組的第一個元素。
在使用指針時,變量名前面的*號代表“解引用”這個指針,也就是得到指針所指的對象。
我先單獨解釋下?*p ?*(p++) ?*(p+2) ?*p++ ?*++p 這幾個表達式的行為:
*p: 就是得到p所指的對象,也就是a中的第一個元素。
*(p++): p++得到的還是p,所以解引用(*)后還是得到p指向的對象,但是p++還會使p自增1,所以之后p就指向之前位置的后一個元素了。
*(p+2): 先p+2,即得到指向p(p指向a的第二個元素)后面第二個位置元素的指針(不是p,這一步也不會改變p的指向),再解引用(*)得到p所指位置后面第二個元素。
*p++: 后置++運算符的優先級要高于*,所以本表達式和*(p++)一樣。
*++p: 前置++運算符的優先級也高于*,且離得更近,所以會先運算 ++p, ++p表達式得到的就是指向p后面一位的指針。再解引用(*)這個指針得到原p所指的后面一位的元素。并且之后p也會自增1,p同樣也指向原來p位置之后的那個元素。
注: ++p 和 p++ 的行為是不同的,上面用下劃線標出了區別。
下面是另一個重點:這幾個printf語句都不該這樣寫!
一個大概的規則是:如果自增或自減運算符應用到一個變量上,那就不要在同一個表達式(或許是語句)中再次使用這個變量! ?(這句不是很準確,因為原因比較復雜,你可以先這樣記)
那么這幾個pritnf語句的毛病就是:這個語句中使用了p++或++p,同時又再次多次使用了p。 這樣的語句的行為是不確定的。
- 2 回答
- 1 關注
- 1629 瀏覽
添加回答
舉報