我定义并初始化了两个数组:
int array1[2][2]={
{1, 1},
{1, 1}
};
int array2 [2][2]={
{2, 2},
{2, 2}
};
现在我想创建并初始化另一个数组,但不是从头开始初始化第三个数组,我想重用其他两个,并将它们编入索引:
int array3[2][2][2]= {
array1,
array2
};
这样我就可以使用array3 [0] [0] [0]得到1而array3 [1] [0] [0]得到2;
有办法做到这一点吗?
答案 0 :(得分:5)
您无法按照自己编写的方式创建数组。但是,您可以这样做:
int array3[2][2][2];
memcpy(array3[0], array1, sizeof(array1))
memcpy(array3[1], array2, sizeof(array2))
答案 1 :(得分:1)
重用和索引其他两个数组的一个选项是创建一个存储指向array1
和array2
的指针的数组,如此
int array1[2][2] = {{1, 1}, {1, 1}};
int array2[2][2] = {{2, 2}, {2, 2}};
int (*array3[2])[2] = {array1, array2};
printf("%d %d\n", array3[0][0][0], array3[1][0][0]); // ouptuts 1 2
这可以避免复制数据,因为array3[0]
指向array1
:
array1[0][0] = 3;
printf("%d\n", array3[0][0][0]);
打印3
答案 2 :(得分:0)
@ rpattiso的答案有一个缺陷,即array3不遵循C语言的行主要约定。
这种技巧会破坏使用初始地址和数组大小来迭代数组中所有元素的代码。
我提出这个问题的原因是我和一个男人做过类似的事情。他试图通过使用“malloc”的for循环来动态分配2D数组,以分配多个1D数组,然后以完全相同的方式将它们组合成2D数组。
然后,当我尝试遍历数组时,假设它是行主要且在内存中连续,我得到了一个非常讨厌的堆损坏。
此解决方案的另一个不太重要的问题是sizeof(array3)不是sizeof(array1)+ sizeof(array2),而是2 * sizeof(int **)。