zoukankan      html  css  js  c++  java
  • 数组指针的一个易错点

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

     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

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

  • 相关阅读:
    destoon去除编辑器替换图片删除原图功能,删除信息删除相关图片功能
    destoon 支付异步接口文件 notify.php 调试方式
    destoon 自定义session丢失
    MySQL中文转换成拼音的函数
    destoon ip接口失效修改 修改后偶尔会加载很慢
    destoon 多表联合查询时出现解析错误,parse_str函数解析错误
    destoon添加修改会员信息时,信息丢失
    destoon 屏蔽会员组,让个人,游客不显示
    jQuery中attr()方法用法实例
    filter 简介
  • 原文地址:https://www.cnblogs.com/douzi2/p/3328486.html
Copyright © 2011-2022 走看看