初始化——C语言中的多维数组



我是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");

如果多维数组是由以null结尾的字符串组成的数组,那么这似乎可以工作,但是如果是由整数或其他数据结构组成的多维数组呢?任何帮助都是感激的。谢谢你。

初始化器赋值器是有区别的。它们都是由=引入的,但它们在语法和语义上是不同的。

对于初始化式, C可以通过左侧类型推断出=右侧的类型。对于赋值,该类型必须与右对齐且与左对齐(lvalue)类型兼容。这里最重要的是:编译器在计算右值时没有左值的类型信息(它甚至没有在那一刻开始赋值表达式)。

初始化器只能与定义一起使用(您似乎将其与声明混淆了-注意,它们是具有不同含义的定义良好的术语)。所以一旦你完成了定义,你就不能再使用_initializer了。

从C99开始,可以使用复合文字。这很像字符串字面值("Hello world"),但是您必须告诉编译器它的确切类型(字符串字面值的类型由"给出)。此外,C不允许像标量或struct那样简单地对数组进行赋值。因此,您必须使用memcpy来代替赋值:

memcpy(matrix[0], (char [10]){ 1,2,3,4, ... }, 10));

注意(char ...}部分,它是复合文字不是强制转换,而是告诉编译器花括号中对象的类型(这里是10 char s的数组)。强制转换OTOH是前缀表达式,并改变后面表达式的类型。请注意,您可以在这里使用_string字面值,但这显然不适用于其他数组元素类型。还要注意,对于字符串字面值,除了提供尽可能多的字符外,您不能定义它们的长度。因此,如果您忘记了两个字符,您将调用未定义行为来读取数组边界之外的内容。(两个是因为隐式末尾的''字符)。

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

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

matrix[0] = (char [10]){ 1,2,3,4,...};

警告:这不允许像第一个版本那样更改条目,因为字面值不能写入!

Extra:这个版本也适用于struct s(不只是指向它们的指针),因为C 允许对它们赋值。

相关内容

  • 没有找到相关文章

最新更新