我对在C ...中初始化多维数组感到困惑。
这有效:
int foo[2][MAX] = {
{2,4,34,43,23,0},
{2,4,34,43,23,0}
};
但这不是:
int foo[2][MAX];
foo = {
{2,4,34,43,23,0},
{2,4,34,43,23,0}
};
怎么回事?
答案 0 :(得分:5)
此语法用于初始化,但在第二种情况下,您将其用于分配,这将无效。
type varName = someValue; // this is declaration and initialization
type varName; // this is declaration
varName = someValue; // this is assignment and not initialization
即初始化只能在申报时进行,否则它是正常的分配。
答案 1 :(得分:2)
{语法仅在您同时初始化和声明数组时有效。 声明后,您需要使用完整的语法:
foo[0][0] = 2;
从技术上讲,C只有一维数组。您可以通过生成数组来创建多维数组。数组的名称将转换为指向其第一个元素的指针,并且只将外部数组转换为指针。它是指向MAX int数组的指针,或int(*)[MAX]。
答案 2 :(得分:1)
正如您所说,此语法用于初始化数组,但在您的第二段代码中:
int foo[2][MAX];
此处,foo
未初始化,然后
foo = {
{2,4,34,43,23,0},
{2,4,34,43,23,0}
};
这是分配,而不是初始化。
答案 3 :(得分:0)
你误解了'初始化'和'赋值'的概念。
例如
int a = 10; // Initialization
初始化只不过是声明+赋值。
但是
int a; // Declaration
a = 10; // Assignment
当你这样做时 -
int foo[2][MAX] = {
{2,4,34,43,23,0},
{2,4,34,43,23,0}
};
在内部了解了2
行和MAX
列。它将初始化整个数组。
可是 -
int foo[2][MAX];
foo = {
{2,4,34,43,23,0},
{2,4,34,43,23,0}
};
此处foo
表示数组的起始地址。在这里,您尝试将值分配给2D数组。当您尝试将值分配给数组时,它不知道有多少行和多少列。所以这是不可能的,也是不允许的。
如果要将输入分配给阵列A,更好的解决方案是从用户/运行时扫描 -
int foo[2][MAX],i,j;
for(i=0;i<2;i++){
for(j=0;j<max;j++)
scanf("%d",&foo[i][j]);
}
答案 4 :(得分:0)
多维与否,C中的数组不可复制,这意味着在初始化完成后,使用核心语言功能无法为整个数组分配任何内容。
但是,仍然可以使用memcpy
函数复制数组。结合复合文字,它可以让你做你想做的事情。您只需使用不同的语法
int foo[2][MAX];
memcpy(
foo,
(int[2][MAX]) {
{2,4,34,43,23,0},
{2,4,34,43,23,0}
},
sizeof foo);
答案 5 :(得分:0)
在C99(或作为扩展程序的gcc)中,您可以使用compound literals:
int (*foo)[MAX];
foo = (int [][MAX]) {
{2,4,34,43,23,0},
{2,4,34,43,23,0}
};
但请注意foo
必须声明为指向MAX
int
的指针(不是2D数组)