• 数组指针的一个易错点


      今天测试了一个程序,来理解一下数组指针,感觉有所收获,在此分享。

     1 int main()
     2 {
     3     int a[6]={1,2,3,4,5,6};
     4     int* ptr1=(int *)&a;
     5     int* ptr2=(int *)(&a+1);
     6     int* ptr3= ptr1 + 1;
     7     printf(" ptr2[0]:%d
    ",ptr2[0]);
     8     printf(" ptr3[0]:%d
    ",ptr3[0]);
     9     return 0;
    10 }

            首先,大家可以猜测下输出什么结果。

            接下来,问大家一个问题,a[6]是一个数组,那么a与&a的区别是什么?我们知道,a代表的是一个数组的首地址,那&a呢?(对于函数而言也是这样,函数名和函数名取个地址似乎没区别。)

            我们,接着看,int* ptr1=(int *)&a;为什么&a前面有个(int *)这里将其强制转换类型干什么?我们将(int *)去掉编译试试,编译器会报错://“初始化”: 无法从“int (*)[6]”转换为“int *”;(编译器为VS2012)这说明&a并不是“int *“类型,而是“int (*)[6]”类型。

           好了,我们看到区别了,a是“int *”类型,而&a是“int (*)[6]”类型。但是,只知道这些是没有意义的,我们继续往下看;

          

          通过VS2012编译器观察,a和&a的地址值是一模一样的都是0x14fcec,在数值上他们是一样的!我们再看a + 1的值是多少它是0x14fcf0

    我们将0x14fcf0-0x14fcec = 0x04;我们发现(a + 1)的值比a的值大4,这个好理解:因为数组a是一个int型数组所以,而一个int占据4个字节。

    我们再比较一下&a和(&a + 1)用0x14fd04 - 0x14fcec = 0x18 = 24;为什么(&a + 1)比 &a大24呢?我们猜想一下,是不是因为数组a里有6个整形数,4 × 6 = 24. 确实是这样的,不信你可以看看将数组改成5你看看地址是不是加了20.

          现在,我们总结一下,a和&a表示的是同一个地址,但是他们等级不同(类型不同),a + 1,地址会递增int的长度,而&a + 1,地址会递增

    int的长度×数组元素的个数。

         在回到,源程序,结果:

      ptr2[0]:-858993460//访问越界了

          ptr3[0]:2

         若将这个概念用到二维数组,会怎样呢?希望大家一起探讨和分享!

  • 相关阅读:
    Python logging根据时间创建日志文件
    ORACLE Merge into 使用
    go安装goctl
    Oracle 行转列
    ORACLE with as查询优化
    Linux环境使用Docker安装MongoDb
    Linux环境使用Docker安装MySql
    Docker基础操作
    Linux基础命令
    Ansible自动化运维介绍
  • 原文地址:https://www.cnblogs.com/douzi2/p/3328486.html
Copyright © 2020-2023  润新知