初始化 - C中的多维数组

Ada*_*Bak 2 c arrays multidimensional-array

我是C的新手,我正在尝试使用多维数组.我有以下示例,我正在尝试初始化多维数组:

char matrix[5][10];  

matrix[0] = {'0','1','2','3','4','5','6','7','8','9'};
matrix[1] = {'a','b','c','d','e','f','g','h','i','j'};
matrix[2] = {'A','B','C','D','E','F','G','H','I','J'};
matrix[3] = {'9','8','7','6','5','4','3','2','1','0'};
matrix[4] = {'J','I','H','G','F','E','D','C','B','A'};
Run Code Online (Sandbox Code Playgroud)

乍一看似乎这种类型的声明是有效的,因为多维数组是一个数组数组; 但是,这个例子无法正确编译,我不完全确定为什么.

我知道我能够使用以下表示法初始化多维数组:

char matrix2[5][10] =
{
    {'0','1','2','3','4','5','6','7','8','9'},
    {'a','b','c','d','e','f','g','h','i','j'},
    {'A','B','C','D','E','F','G','H','I','J'},
    {'9','8','7','6','5','4','3','2','1','0'},
    {'J','I','H','G','F','E','D','C','B','A'},
};
Run Code Online (Sandbox Code Playgroud)

但是,如果我在声明时不知道数组的内容并希望稍后用数据填充此数组,该怎么办?我可以按如下方式初始化每个元素:

matrix[0][0] = '0';
matrix[0][1] = '1';
matrix[0][2] =  '2';
etc....
Run Code Online (Sandbox Code Playgroud)

我想知道是否有可能使用我原来的方法声明每个数组:

matrix[0] = {'0','1','2','3','4','5','6','7','8','9'};
matrix[1] = {'a','b','c','d','e','f','g','h','i','j'};
etc...
Run Code Online (Sandbox Code Playgroud)

我尝试使用strcpy如下:

strcpy(matrix[0], "012345678");
strcpy(matrix[1], "abcdefghi");
Run Code Online (Sandbox Code Playgroud)

看起来如果多维数组是一个以空字符结尾的字符串数组,这可能会起作用,但是它会等同于整数或其他数据结构的多维数组.任何帮助表示赞赏.谢谢.

too*_*ite 7

初始化者作业之间存在差异.它们都是由它们引入的=,但它们在语法和语义上都是不同的.

对于初始化程序,C可以推导出=左侧类型的右侧类型.对于赋值,必须知道右侧的类型并且与左侧(左值)类型兼容.最重要的是:在评估右侧时,编译器没有来自左值的类型信息(此时它甚至没有启动赋值表达式).

一个初始化器必须只被用在定义(你似乎有混淆声明 -留意,它们是具有良好定义的术语不同的含义).所以,一旦你完成了定义,你就不再使用_initialiser了.

从C99开始,您可以使用复合文字.这很像字符串文字("Hello world"),但你必须告诉编译器它的确切类型(字符串文字的类型由它给出").此外,C不允许像标量或structs 一样简单地分配数组.因此,您必须memcpy代替作业:

memcpy(matrix[0], (char [10]){ 1,2,3,4, ... }, 10));
Run Code Online (Sandbox Code Playgroud)

注意复合文字(char ...}部分.这不是强制转换,而是告诉编译器大括号中的对象具有哪种类型(此处:s 数组).强制转换OTOH是前缀表达式,并更改以下表达式的类型.请注意,您可以在此处使用_string文字,但这显然不适用于其他数组元素类型.另请注意,对于字符串文字,除了提供尽可能多的字符外,您无法定义其长度.因此,如果您忘记了两个字符,则将调用未定义的行为以读取数组边界外部.(两个因为隐含的尾随字符).10 char'\0'

对于维度,最好使用符号常量(即C中的宏),#define ROWS 10以避免代码中的幻数 - 您必须多次使用这些值.

对于指针数组,您可以使用更简单的方法:

matrix[0] = (char [10]){ 1,2,3,4,...};
Run Code Online (Sandbox Code Playgroud)

警告:这不允许更改的条目,如第一个版本呢,因为文字不能写!

附加:此版本也适用于structS(不只是指向它们的指针),因为C 不会允许那些任务.对我来说,这看起来像C之一的不规则之处.