int w[2][3],(*pw)[3];pw=w;
則下列錯誤的是
a.*(w[0]+2)
b.*(pw+1)[2]
c..pw[0][0]
d.*(pw[1]+2)
今天晚上因為這道小題仔細研究了C的多維陣列和指向多維陣列的指標(歸根結底,這兩個東西完全一致)
上面的題是二維的,當你理解了這個題之後,多維的自然就通了。。。
要解決這類的問題,需要深刻理解“*,&,[]”這三個符號在對多維陣列操作時的作用,下面就講一下他們
在多維陣列中的作用。
(1)*:得到對應指標中的儲存的“東西”(一維的時候,這個東西是最體的值;二維時,這個東西就是指向一維數組的一個指標,三維時。。。多維時。。。)。
(2)&: 得到相應變數的地址。
(3)[]:表示相對於當前指標的位移量。這一句對理解題意非常關鍵。比如:
例1:對int a[5],則a[3]表示相對於a位移3個位置:
即:a[3] = *(a+3)
例2:對int a[5][4],則a[3][2]表示相對a[3]位移2個位置,而a[3]表示相對於a位移3個位置:
即:a[3][2]= *(a[3]+2) = *(*(a+3)+2)
例3:對int a[5][4][3],則a[3][2][1]表示相對a[3][2]位移1個位置,a[3][2]相對a[3]位移2個位置,而a[3]表示相對於a位移3個位置:
即:a[3][2][1]= *(a[3][2]+1) = *(*(a[3]+2)+1) = *(*(*(a+3)+2)+1)
對於更多維的以此類推:。。。。
這裡面是用數組名即指標常量。對於一個指標變數的情況相同,如:
對int a[5],*p,p=a; 則a[3]=p[3]=*(p+3);
對int a[5][4],(*p)[4],p=a; 則a[3][2]=p[3][2]=*(p[3]+2)=*(*(p+3)+2);
注意:上面得到的最終的結果的最終形式是類似:*(*(p+3)+2),這個式子最內部的括弧中的維度最高,而在展開內部括弧時,位移量需要乘上維度權值(即每一維中儲存的元素的個數)例如:
對於int a[5][4],(*p)[4],p=a; 則a[3][2]=p[3][2]=*(p[3]+2)=*(*(p+3)+2)=>*(*(p)+3×4+2)=*(*p+3×4+2) //p為指向二維數組的指標,*p為指向一維的指標。需要深刻理解這一點。。。
對於上面的題來說,還有個知識點:就是[]的優先順序高於*,因此
對於B選項:*(pw+1)[2] 等價於:*((pw+1)[2]) 按照例1的作法 =>*(*(pw+1+2)) 即:*(*(pw+3))=*(*(pw+3)+0)=*(pw[3]+0)=pw[3][0]=w[3][0](已經越界).
注意:對於a[n]代表取出(a+n)位置的值,即a[n]=*(a+n) 。所以本題:(pw+1)[2]=*(pw+1+2)
其他的選項均可參照上面的對[]的講解,並結合*,& 靈活轉換,確定是否越界:
對於a. *(w[0]+2) = w[0][2] 參照例2(即:"a[3][2]= *(a[3]+2)" )逆運算
c. pw[0][0]=w[0][0]
d. *(pw[1]+2) 同選項a作法一樣(因為pw與w實質是一樣的,不同的是,w是一個指向一維數組的指標常量,而pw是指向一維數組的指標變數。說白了,就是w不能改變,而pw可變僅此而已)