原来二维数组内部隐藏着这样不为人知的秘密......

来源:互联网 发布:手机淘宝5.7.2版本苹果 编辑:程序博客网 时间:2024/05/20 16:42

二维数组的自我介绍

大家好,我是一个二维数组,像你们人类一样,我有一个具体的名字,字”int”,名”[3][4]” . ,见名知其意,我其实就是一个三行四列的整型数组,可能我这么一介绍自己,你们脑子里我高大的形象可能就建立起来了,如下图.
这里写图片描述
但我其实就是一个”照骗”,在内存里,我就原形毕露了,
这里写图片描述
在内存中我和一维数组长得一样,都是一个个元素站好队,连续排列起来的.
这时候你可能就会疑问了,俺和一维数组有啥子区别呢,俺当然说我们~不一样!
这一切都要从我和一维数组的地址说起…
你们已经知道了,我名字叫 int[a][b]但我感觉还是不够酷炫,所以决定起个别号,叫”a”,
这里就有个完整定义了,

int a[3][4];

为了和一维数组区分,我们在拉过来一个小b

int b[3];

我和一维数组最大区别就是,当我们作为参数传参的时候传的是首地址,
but

  • 一维数组的首地址是首个元素的地址

  • 二维数组的首地址是首个数组的地址

    但是我们有个相同点就是遇到取地址符号&的时候表示的是
    整个元素的地址

  • -

你肯定会问,首个数组是啥玩意啊,别急 我再来给你一张我的自拍
这里写图片描述

说白了我这个三行四列的二维数组,就是三个长度为四的一维数组组成的,

二维数组a[3][4]作为参数的时候a就表示的是a[0]的地址,a[0]是个数组
a+1访问的是a[1] (第二个数组)
a[0]+1 访问的是a[0][1](第一个数组的第二个元素)
所以明白这个道理 接下来这段代码就有意思了

        int a[3][4] = {0};        printf("&a的地址是        %p\n", &a);        printf("&a+1的地址是       %p\n", &a+1); //跳过整个二维数组        printf("a +1的地址是       %p\n", a +1); //跳过第一行 一行16字长        printf("a + 2的地址是      %p\n", a + 2);// 跳过第1,2printf("&a[0] +1的地址是   %p\n", &a[0] +1);//跳过第一行        printf("&a[0] + 2的地址是  %p\n", &a[0] + 2); //跳过第1, 2printf("a[0] +1的地址是    %p\n", a[0] + 1);//跳过第一行中的第一个        printf("a[0] +2的地址是    %p\n", a[0] +2);//跳过第一行中的第一个

这里是运行结果
这里写图片描述

总结

  • 数组参数 a表示首地址
  • &a表示整个数组的地址
  • 它们的地址都是一样的 但是+1后结果明显不一样
  • 一维数组首地址是首元素的地址
  • 二维数组首地址是首个数组的地址
  • -
原创粉丝点击