• 数组中&a与&a[0]的区别 转载自http://blog.csdn.net/FX677588/article/details/74857473


    在探讨这个问题之前,我们首先来看一道笔试题,如下:
      【摘自牛客网】下列代码的结果是:(正确答案是 C)

    main()
    {
    int a[5]={1,2,3,4,5};
    int *ptr=(int *)(&a+1);
    printf("%d,%d",*(a+1),*(ptr-1));
    }
    1
    2
    3
    4
    5
    6
      A、3,5   B、2,4   C、2,5   D、3,4
      下面我们来分析一下选择C的原因,解释清楚这个题的正确答案,你就能清楚数组中&a与&a[0]存在什么区别了。
      题目中首先定义了存放5个int类型空间大小的内存,然后初始化5个数。我们知道直接使用数组的名字a表示的是一个指向数组首地址的指针,所以直接a与&a[0]是相同的意思,都表示数组的首地址。所以*(a+1)很好理解,假设a地址是0x1000,就是取(0x1000+sizeof(int))地址的数,由于数组的物理地址是连续的,当然就是取2。
      那&a表示什么意思呢,相当于取存放指向数组首地址的指针的存储地址,话有些绕,但是细细品味你就会发现,它就相当于二维指针,假设每个一维指针指向一排数组(当然除了第一个一维数组的指针之外实际都没有申请,但是在访问野指针之前计算机也不知道那块地址是否存在,但的确可以由物理地址连续性来获取这块地址的表示),所以简言之&a表示第一排数组,&a+1就是表示第二排数组(就是5*sizeof(int)=5*4=20空间大小后一段空间的首地址)。
      有了上面的介绍就好理解了,*(ptr-1)是表示取(0x1000+5*sizeof(int)-sizeof(int))地址中的数,算得为5。
      总结:
      &a[0]表示数组的首地址,与直接a相同意义。而&a表示存储指向数组首地址的指针的地址,可以用二维指针来理解。

      其他二维指针和数组更详细说明请阅读博文:http://blog.csdn.net/fx677588/article/details/69592329

      个人学习记录,由于能力和时间有限,如果有错误望读者纠正,谢谢!
      转载请注明出处:http://blog.csdn.net/FX677588/article/details/74857473
    ---------------------
    作者:无鞋童鞋
    来源:CSDN
    原文:https://blog.csdn.net/fx677588/article/details/74857473
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    MySQL实现了四种通信协议
    深入了解Windows句柄到底是什么
    Linux虚拟地址空间布局以及进程栈和线程栈总结
    malloc 函数详解
    数组指针和指针数组的区别
    Linux中sudo配置
    ctrl+c,ctrl+d,ctrl+z在linux程序中意义和区别
    linux select函数详解
    linux grep命令详解
    Linux find 用法示例
  • 原文地址:https://www.cnblogs.com/zhouweibaba/p/10127904.html
Copyright © 2020-2023  润新知