• 二维数组零碎知识梳理


    目录

    前言

    一、二维数组的结构

     二、数组作为函数参数

    1、一维数组传参

    2、二维数组传参

    三、用指针控制二维数组

    总结


    前言

    哈喽,小伙伴们大家好。在c语言中二维数组的结构比较复杂,尤其是和指针结合到一起后。由于最近一直在学c++,对二维数组的部分知识感觉生疏了,所以写一篇博客对这些知识进行总结。


    一、二维数组的结构

    我们可以把二维数组理解成是先有一个一维数组,然后一维数组的元素类型同样是一维数组,也就是数组里嵌套数组。

     把每一行理解成一个独立的数组,arr[i]选择第i行的数组,arr[i][j]选择第i行第j个元素。

    那么二维数组在内存中是怎样分布的呢?

    1. int main()
    2. {
    3. int arr[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
    4. for (int i = 0; i < 3; i++)
    5. {
    6. for (int j = 0; j< 3; j++)
    7. {
    8. printf("%p\n", &arr[i][j]);
    9. }
    10. }
    11. }

    经过打印发现二维数组在内存中是连续分布的,只不过为了方便理解,我们把它想象成二维的。

     二、数组作为函数参数

    1、一维数组传参

    我们先来看一下一维数组传参。

    1. int size(int arr[]) //int size(int* arr)
    2. {
    3. return sizeof(arr);
    4. }
    5. int main()
    6. {
    7. int arr[3];
    8. int size1=sizeof(arr);
    9. int size2 = size(arr);
    10. printf("%d %d", size1,size2);
    11. }

     

    从结果可以看出,当数组作为函数参数时,函数并不会傻乎乎的把真个数组全部拷贝一份,而是会取数组首元素的地址。所以一维数组传参函数的参数既可以写成数组,也可以写成指针,反正传过去的都是首元素的地址。

    2、二维数组传参

    在一维数组arr中,arr相当于首元素的地址,等同于&arr[0]。而&arr相当于整个数组的地址,对整个数组解引用等于首元素的地址(说实话我也不太懂为啥,但语法就这么规定的),想要接受整个元素的地址,必须用数组指针。

    在二维数组arr中,类比一维数组,arr是首元素的地址,二维数组的首元素就是第一行数组,所以arr就是整个第一行数组的地址。所以二维数组传参要用二维数组接收或者用数组指针接收。

    1. void test1(int arr[][3])//和二维数组定义时相同,行元素个数可以省略,列不可以
    2. {}
    3. void test2(int(*p)[3])
    4. {}
    5. int main()
    6. {
    7. int arr[3][3];
    8. test1(arr);
    9. test2(arr);
    10. }

    三、用指针控制二维数组

    对二维数组arr来说,arr是第一行数组的地址,arr+i是第i行数组的地址,*(arr+i)是第i行数组首元素的地址(上面提到了,一个数组的地址解引用等于首元素的地址)。所以*(*(arr+i)+j)就拿到了元素arr[i][j]。


    总结

    以上就是今天要讲的内容。本文主要是对二维数组一些易混淆的零碎知识进行了讲解,希望能给大家带来帮助。感谢阅读,来日方长,期待下次见面。

  • 相关阅读:
    2024.2.15 模拟实现 RabbitMQ —— 消息持久化
    LabVIEW开发基于图像处理的车牌检测系统
    数据结构与算法04:队列
    [附源码]计算机毕业设计基于SpringBoot的玉石交易系统
    D. Non-zero Segments(前缀和)
    怎么去写网站的交互设计文档
    HLS直播协议详解
    LabVIEW样式检查表2
    传输层——UDP
    OD_2024_C卷_200分_1、爱吃蟠桃的孙悟空【JAVA】【二分法】
  • 原文地址:https://blog.csdn.net/weixin_59371851/article/details/126101491