• C语言数组相关问题深度理解


    40511d864e6742dd912c84b80c6b6d68.gif

        大家好呀!我是小杨。小杨把C语言中的数组中常见的问题做了一个小总结,希望在方便自己理解复习的同时也能够帮助到大家。

    2537a46fb4034f2793f8a5a481f50dc5.gif


     问题清单:

    问题1:字符数组的两种写法区别?

    问题2:二维数组能否看作成一维数组?

    问题3:一维数组与二维数组在内存中的存储联系?

    问题4:二维数组的行数可以省略,列数不可省略的原因?

    问题5:一维数组和二维数组的越界访问?

    问题6:数组传参时,形参的两种写法?

    问题7:冒泡排序进行对整型数组进行升序排序?


    问题解答:

    问题1:字符数组的两种写法?

    解答:由于C语言中没有字符串类型,所以用char数组代字符串类型,定义字符数组的方式有两种,分别为:以单字符形式和以字符串形式。
    方式一:以单字符形式
    要声明初始化一个可存储四个有效值的字符数组,形式如下:
    char ch[4]={'w','o','r,'d'};


    方式二:以字符串形式
    要声明初始化一个可存储四个有效值的字符数组,形式如下:
    char str[5]=''word";
    //字符串数组大小一定要先声明为5,因为要留出str[4]给编译器自动存储'\0',如若声明初始化为:char str[4]="word",报错


    注意:
    1.当未存满时,对于两种数组,剩余的有效位置都默认初始化为'\0' 
    2.当存满时,字符数组最后一个有效位置不一定赋值为'\0',仍可以是想要存储的有效值,但字符串数组的最后一位有效位置一定为'\0'


    问题2:二维数组能否看作成一维数组?

    解答:可以,二维数组本来就是被看成特殊的一维数组,可被理解为二维数组是一维数组的数组。通俗理解是:原二维数组的每一行代表该特殊一维数组中的元素。

    c1f8cce3a530463d98fd78597c15992e.png


    问题3:一维数组与二维数组在内存中的存储联系?

    解答:一维数组和二维数组在内存中的布局方式都是一样的,即在内存中是连续存放的,从低地址向高地址方向移动;但是两者的访问形式有所差异,分别是以一维数组和二维数组的访问形式来进行。

    一维数组在内存中的存储示意图:

    9fbb061efb63461f93b8bf4965bdda69.png

     

    二维数组在内存中的存储示意图:

    c8e40cb9fb274befa7ddb6a0e4dfc46e.png


    问题4:二维数组的行数可以省略,列数不可省略的原因?

    解答:二维数组可以省略行。 因为二维数组存储的时候是“先行后列”,如果不指定列数,就不能知道一行放几个数据,而只要知道了列数,排头就可以知道一共能放多少行。 


    问题5:一维数组和二维数组的越界访问?

    解答:数组的下标是有范围限制的。 数组的下规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1。 所以数组的下标如果小于0,或者大于n-1,就是数组越界访问了,超出了数组合法空间的访问。二维数组的行和列也可能存在越界。 而C语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,并不意味着程序就 是正确的, 所以程序员写代码时,最好自己做越界的检查。

    一维数组越界示意图:

    3856c7065dff4cc3b2ab75ae63eafea8.png

    二维数组越界示意图:

    1ecd12d250e543b48335b25ecd4839d9.png


    问题6:数组传参时,形参的两种写法?(与问题7相联系)

    解答:写法1:数组形式   写法2:指针形式

    示例用问题7来具体说明两者。

    数组形式示意图:

    8087e9212d0146f090d62e21fdd8504d.png

    指针形式示意图:

    d199fb23794f40faa67d03da311c7fce.png


    问题7:冒泡排序进行对整型数组进行升序排序?

    解答:冒泡排序核心思想:将两个相邻元素进行比较。

    冒泡排序的结果是一趟冒泡排序让一个数据来到它最终该出现的位置。

    冒泡排序原理示意图:

    第一趟冒泡排序流程示意图:

    ae9785bb98d04806b76d96d84cce469c.png

     依次冒泡排序流程示意图: 

    d8dcfe4c61c7498996ebee98a625f506.png

    代码示例及部分分析:

    ba0884f777f24861a1e4675876a47dd4.png

     代码输出结果图:

    ee8fd1540847479a86018f29687291b0.png


    结语

    小伙伴们,当你学到这里的时候,你们应该收获了挺多的东西吧!🥳🥳🥳后续小杨会给大家总结其他的内容,不断更新优质的内容来帮助大家,一起进步。加油,追梦人!让我们一起拥抱美好明天!🎆🎆🎆

    80b424c160bd43bbb0a115b9c15cfabe.gif


     

  • 相关阅读:
    读写/dev/kmsg设备编程实例
    elementUI select组件value注意事项(value失效问题)
    超算/先进计算如何改变现如今对的生活
    Jekyll 的机制、转换步骤和结构介绍
    Node 进阶学习
    集群与负载均衡的工作流程
    Effective C++改善程序与设计的55个具体做法 3. 资源管理
    推荐算法---矩阵分解
    网络服务性能优化:Wrktcp与Perf工具详解
    小视频管理软件stash
  • 原文地址:https://blog.csdn.net/m0_64338546/article/details/125628246