我们说我有一个9维数组:
int arr[4][4][4][4][4][4][4][4][4];
我想将每个元素初始化为1。
我知道我可以使用多个循环初始化它:
for(int i1 = 0; i1 < 4; i ++) {
...// eight more similiar loops
}
但它看起来很难看。
这样做的最佳做法是什么?也许我可以使用宏?
答案 0 :(得分:2)
在C中,多维数组是连续的,因此您可以通过指针初始化arr来利用这一点。
int* parr = (int*)arr;
for (int i = 0; i < ((sizeof(arr)/sizeof(int)); ++i)
parr[i] = 1;
请注意,这在数组分解为指针的情况下不起作用(例如,如果它作为参数传递给函数)。
答案 1 :(得分:1)
这样写:
int *p = &arr[0][0][0][0][0][0][0][0][0];
for( int i = 0; i < 4*4*4*4*4*4*4*4*4; i++)
*p++ = 1;
@nuk因为arr是一个类型
int[4][4][4][4][4][4][4][4][4] // 9 of '[4]'
所以
int arr[4][4][4][4][4][4][4][4][4];
sizeof(arr) = sizeof(int[4][4][4][4][4][4][4][4][4]);
= sizeof(int) *4*4*4*4*4*4*4*4*4;
但如果你在这里传递指针,
int* arr;
sizeof(arr) = sizeof(int*)
= sizeof(void*)
= Usually the target file's BIT / 8
答案 2 :(得分:0)
也许使用递归函数,该函数传递初始化所需的数字级别。
void init(int * arr, int level, int size, int value)
{
for(int i = 0; i < size; i++)
{
if(level == 0)
arr[i] = value;
else
init(arr[i], level - 1, size, value);
}
}
答案 3 :(得分:0)
如果你想初始化为零,那么一个好的memset
就可以做到:
int arr[4][4][4][4][4][4][4][4][4];
memset(&arr, 0, sizeof(arr));
那说,但是,既然你想要初始化为1,我应该说在C中使用9D数组通常看起来至少有点糟糕。你总是要在任何地方声明那种严苛的类型你将它传递给一个函数,你将永远无法以任何通用的方式使用间接索引。只是声明一个2 18 大int
- 数组并且手动计算索引,你可能更好。当然,这是你的背景,所以不是因为你没有理由。 :)