• 《C和指针》笔记32:多维数组初始化


    使用括号进行初始化

    我们可以给数组赋值一个长长的列表:

    int matrix[2][3] = { 100, 101, 102, 110, 111, 112 };
    
    • 1

    它等价于

    matrix[0][0]=100;
    matrix[0][1]=101;
    matrix[0][2]=102;
    matrix[1][0]=110;
    matrix[1][1]=111;
    matrix[1][2]=112;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    但是强烈建议下面的形式进行二维数组初始化

    int two_dim[3][5] = {
    	{00, 01, 02, 03, 04},
    	{10, 11, 12, 13, 14},
    	{20, 21, 22, 23, 24}
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5

    三维数组初始化

    int three_dim[2][3][5] = {
    	{
    		{000,001,002,003,004},
    		{010,011,012,013,014},
    		{020,021,022,023,024}
    	}
    	{
    		(100,101,102,103,104},
    		{110,111,112,113,1141,
    		{120,121,122,123,124}
    	}
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    更高维的数组也是一样的。

    既然加不加那些花括号对初始化过程不会产生影响,那么为什么要不厌其烦地加上它们呢?

    • 首先是它有利于显示数组的结构。一个长长的单一数字列表使你很难看清哪个值位于数组中的哪个位置。因此,花括号起到了路标的作用,使你更容易确信正确的值出现在正确的位置。
    • 其次,对于不完整的初始化列表,花括号就相当有用。如果没有这些花括号,你只能在初始化列表中省略最后几个初始值。即使一个大型多维数组只有几个元素需要初始化,你也必须提供一个非常长的初始化列表,因为中间元素的初始值不能省略。但是,如果使用了这些花括号,每个子初始列表都可以省略尾部的几个初始值。同时,每一维的初始列表各自都是一个初始化列表

    为了说明这个概念,我们对一个四维数组初始化列表,假定我们只需要对数组的两个元素进行初始化,元素[0][0][0][0]初始化为100,元素[1][0][0][0]初始化为200,其余的元素都缺省地初始化为0。下面是我们用于完成这个任务的方法:

    int four_dim[2][2][3]{5]={
    	{
    		{
    			{100}
    		}
    	},
    	{
    		{
    			{200}
    		}
    	}
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    如果初始化列表内部不使用花括号,我们就需要下面这个长长的初始化列表:

    int four_dim[2][2][3][5]=(100, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 200}:
    
    • 1
    • 2
    • 3

    这个列表不仅难于阅读,而且一开始要准确地把100和200这两个值放到正确的位置都很困难。

    初始化省略维度

    在多维数组中,只有第1维才能根据初始化列表缺省地提供。剩余的几个维必须显式地写出,这样编译器就能推断出每个子数组维数的长度。

    int two_dim[][5]={ 
    	{ 00, 01, 02 }, 
    	{ 10, 11 }, 
    	{ 20, 21, 22, 23 }
    }
    • 1
    • 2
    • 3
    • 4
    • 5

    编译器只要数一下初始化列表中所包含的初始值个数,就可以推断出最左边一维为3。

    为什么其他维的大小无法通过对它的最长初始列表的初始值个数进行计数自动推断出来呢?

    原则上,编译器能够这样做。但是,这需要每个列表中的子初始值列表至少有一个要以完整的形式出现(不得省略末尾的初始值),这样才能保证编译器正确地推断出每一维的长度。但是,如果我们要求除第1维之外的其他维的大小都显式提供,所有的初始值列表都无需完整。

    参考

    1. 《C和指针》
  • 相关阅读:
    《棒球动漫》:无愧的青春·棒球1号位
    renren分离版api开发爬坑
    微软Power Platform平台低代码
    云南师范大学计算机考研资料汇总
    pdf转换工具怎么用?手把手教会你~
    AR爆发的前夜,Rokid站在了门口
    steam搬砖项目月入过万靠谱吗
    编译安装并刷写高通智能机器人SDK
    【Python&GIS】基于高德Api实现批量地址查询经纬度
    如何用微信小程序实现远程控制无人售货柜
  • 原文地址:https://blog.csdn.net/subtitle_/article/details/133561665