我对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'};乍一看,这种类型的声明似乎是有效的,因为多维数组是数组的数组;然而,这个示例无法正确编译,我不完全确定为什么。
我知道我能够使用以下符号初始化多维数组:
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'},
};但是,如果我在声明时不知道数组的内容,并且希望以后用数据填充这个数组,该怎么办?我可以按以下方式初始化每个单独的元素:
matrix[0][0] = '0';
matrix[0][1] = '1';
matrix[0][2] = '2';
etc....我想知道是否可以用我最初的方法声明每个数组:
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...我尝试使用strcpy,如下所示:
strcpy(matrix[0], "012345678");
strcpy(matrix[1], "abcdefghi");如果多维数组是一个以空结尾的字符串数组,但是它相当于多维整数数组或其他数据结构,那么这似乎是可行的。任何帮助都是非常感谢的。谢谢。
发布于 2015-10-04 16:53:02
初始化者和赋值之间有区别。它们都是由=引入的,但它们在语法和语义上是不同的。
对于初始化器,C可以根据左侧类型推断=右侧的类型。对于赋值,类型必须与右侧知道,并与左侧(lvalue)类型兼容。这里最重要的一点是:编译器在计算右侧时没有来自lvalue的类型信息(它当时甚至没有启动赋值表达式)。
初始化项只能与定义一起使用(您似乎将其与声明- pay heed相混淆,它们是定义良好的术语与different meaning)。因此,一旦完成了定义,就可以再使用_initialiser了。
从C99开始,您可以使用复合文字。这很像字符串文本("Hello world"),但是您必须告诉编译器它的确切类型(字符串文本的类型是由"提供的)。此外,C不允许像标量或struct那样简单地分配数组。因此,您必须使用memcpy而不是赋值:
memcpy(matrix[0], (char [10]){ 1,2,3,4, ... }, 10));注意(char ...}部分,它是复合文字。这不是a,而是告诉编译器在大括号中输入对象的类型(这里是10 char的数组)。cast OTOH是一个前缀表达式,可以更改以下表达式的类型。请注意,您可以在这里使用_string文本,但这显然不适用于其他数组元素类型。还请注意,对于字符串文本,除了提供尽可能多的字符外,您不能定义它们的长度。因此,如果您忘记了两个字符,您将调用未定义的行为来读取外部数组边界。(两个是因为隐式尾随'\0'字符)。
对于维度,最好使用符号常量(即C中的宏),比如#define ROWS 10,以避免代码中的神奇数字--您必须多次使用这些值。
对于一个指针数组,您可以使用更简单的方法:
matrix[0] = (char [10]){ 1,2,3,4,...};警告:--这不允许像第一个版本那样更改条目,因为文字不能写到!
额外:这个版本也适用于struct(不仅仅是指向它们的指针),因为C确实允许为它们分配任务。在我看来,这似乎是C人不得不忍受的违规行为之一。
https://stackoverflow.com/questions/32935894
复制相似问题