一道小题:指向二维数组的指针...我的一点理解(int w[2][3],(*pw)[3];pw=w; 则下列错误的是 a.*(w[0]+2) b.*(pw+1)[2] c..pw[0][0] d.*(pw[1]+2) )

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可变仅此而已)

       


   
    
   




你可能感兴趣的:(C/C++)