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)
看起来如果多维数组是一个以空字符结尾的字符串数组,这可能会起作用,但是它会等同于整数或其他数据结构的多维数组.任何帮助表示赞赏.谢谢.
初始化者和作业之间存在差异.它们都是由它们引入的=,但它们在语法和语义上都是不同的.
对于初始化程序,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之一的不规则之处.
| 归档时间: |
|
| 查看次数: |
135 次 |
| 最近记录: |