我想知道,鉴于下面的声明:
int first[1][COLUMN_NUMBER];
int second[COLUMN_NUMBER];
可以以相同或相似的方式访问两个二维阵列。我的意思是:他们可以互换吗?我问这个是因为,由于升级,我想避免重构我之前编写的所有代码。
非常感谢。
答案 0 :(得分:3)
根据this piece of code,应该没有区别。
#include <stdio.h>
int main(void) {
int const COLUMN_NUMBER = 10;
union {
int first[1][COLUMN_NUMBER];
int second[COLUMN_NUMBER];
} u;
u.first[0][5] = 3;
printf("%d\n", u.second[5]);
return 0;
}
答案 1 :(得分:1)
2D阵列和相同大小的1D阵列不相同/相似,尽管2D阵列可以表示为1D array(严格来说是behavior is undefined)。
我的意思是:他们可以互换吗?
可能取决于具体情况 通过调用函数
可以看到一个简单的区别void foo(int *p)
{
}
两个案例。通过传递first
,foo
或&first[i][j]
(其中*first
和first[i]
为{i
},j
可以传递给int
{1}}类型并表示数组边界内的行和列索引)而数组second
可以作为second
或&second[i]
传递。
您不能将first
(与second
不同)和second[i]
(与first[i]
不同)作为参数传递给foo
,因为它们与预期的参数不相容foo
(int *
)。
答案 2 :(得分:0)
int first[1][10];
int second[10];
对于这个例子,这两个语句在内存分配上没有区别。第一个语句声明一个包含1行和10列的数组。类似地,第二个语句创建一个只有10个元素的数组。逻辑上两个语句不同但这两个都占用相同的内存空间。 在第一个语句的情况下,如果我们首先使用int [10] [10],那么它将声明一个包含10行和10列的数组。