2 回答

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

TA貢獻(xiàn)883條經(jīng)驗(yàn) 獲得超454個(gè)贊
在定義變量時(shí),變量名前面的*號(hào)代表這個(gè)變量是指針:
int *p=a ?這樣p是一個(gè)指向int的指針,并且被初始化為指向a數(shù)組的第一個(gè)元素。
在使用指針時(shí),變量名前面的*號(hào)代表“解引用”這個(gè)指針,也就是得到指針?biāo)傅膶?duì)象。
我先單獨(dú)解釋下?*p ?*(p++) ?*(p+2) ?*p++ ?*++p 這幾個(gè)表達(dá)式的行為:
*p: 就是得到p所指的對(duì)象,也就是a中的第一個(gè)元素。
*(p++): p++得到的還是p,所以解引用(*)后還是得到p指向的對(duì)象,但是p++還會(huì)使p自增1,所以之后p就指向之前位置的后一個(gè)元素了。
*(p+2): 先p+2,即得到指向p(p指向a的第二個(gè)元素)后面第二個(gè)位置元素的指針(不是p,這一步也不會(huì)改變p的指向),再解引用(*)得到p所指位置后面第二個(gè)元素。
*p++: 后置++運(yùn)算符的優(yōu)先級(jí)要高于*,所以本表達(dá)式和*(p++)一樣。
*++p: 前置++運(yùn)算符的優(yōu)先級(jí)也高于*,且離得更近,所以會(huì)先運(yùn)算 ++p, ++p表達(dá)式得到的就是指向p后面一位的指針。再解引用(*)這個(gè)指針得到原p所指的后面一位的元素。并且之后p也會(huì)自增1,p同樣也指向原來p位置之后的那個(gè)元素。
注: ++p 和 p++ 的行為是不同的,上面用下劃線標(biāo)出了區(qū)別。
下面是另一個(gè)重點(diǎn):這幾個(gè)printf語句都不該這樣寫!
一個(gè)大概的規(guī)則是:如果自增或自減運(yùn)算符應(yīng)用到一個(gè)變量上,那就不要在同一個(gè)表達(dá)式(或許是語句)中再次使用這個(gè)變量! ?(這句不是很準(zhǔn)確,因?yàn)樵虮容^復(fù)雜,你可以先這樣記)
那么這幾個(gè)pritnf語句的毛病就是:這個(gè)語句中使用了p++或++p,同時(shí)又再次多次使用了p。 這樣的語句的行為是不確定的。
- 2 回答
- 1 關(guān)注
- 1627 瀏覽
添加回答
舉報(bào)