• 指针


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

  • 相关阅读:
    设计模式之单例模式实践
    有关集合的foreach循环里的add/remove
    项目中常用的MySQL优化方法--壹拾玖条
    Solr
    Lucene补充
    Lucene
    一千行 MySQL 学习笔记
    Servlet
    CSS未知宽高元素水平垂直居中
    深拷贝和浅拷贝
  • 原文地址:https://www.cnblogs.com/wangh0802PositiveANDupward/p/2528494.html
Copyright © 2020-2023  润新知