指针

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

posted @ 2012-05-31 15:10  奔流聚海  阅读(375)  评论(0编辑  收藏  举报