有人能提醒我将C中的数组(特别是多维)分配给单个值的语法吗?
我相信这些波浪形的括号做了这个,虽然我在测试时遇到了编译器错误:
int ArrayName [5][5] = {1};
将数组初始化为1。
答案 0 :(得分:6)
C语言中没有紧凑的语法可以将数组的所有元素初始化为单个值,无论数组是多维的还是单维的。有一种语法可以将所有元素专门设置为零(并且它是= { 0 }
),但对于任何其他值,它是不可能的。
当然,你可以为所有数组元素拼出单独的初始值设定项,但这可能不是你想要的。
您所能做的就是通过使用赋值手动将所有元素设置为特定值。
答案 1 :(得分:1)
我不确定这是否可行。您应该使用for
或while
循环。
如果要用单个字节填充内存,可以使用memset
函数。
答案 2 :(得分:1)
可以使用动态构建多维数组 指向malloc的指针。在下面的例子中,单个 指向指针指向int的指针。申报后, 指针没有任何有意义的值。然后打电话给马拉克请求 指针指向nx个有效内存单元块:
x = (int **) malloc(nx * sizeof(int *));
此次通话后,x现在有一个有效值;特别是 包含nx的内存块的起始地址 指针到INT。这些指向int的每个指针都是常规的 指针,正如我们多次看到的那样。他们还没有 初始化为任何有意义的东西,每个都可以访问 <或者
x[0], x[1] ... x[nx-1], OR *x, *(x+1), *(x+2),
... *(x+nx-1).
为每个指针赋予一个有意义的值, 我们可以为每个人调用malloc,例如完成 这个循环:
for (i=0;i<nx;++i){
x[i] = ( int * ) malloc( ny * sizeof(int));
}
请注意,我们也可以说:
for (i=0;i<nx;++i){
*(x+i) = ( int * ) malloc( ny * sizeof(int));
}
现在指针数组中的每个指针都指向a 有意义的内存块(每个大小为ny int),我们可以分配 值。要了解如何分配值,请考虑 原理图如下。你需要仔细研究这个,直到 发生了什么事情非常清楚。这可能有点棘手但是 一旦掌握了它,就不会那么糟糕。
x[0] ---> | *x[0] | *x[0]+1 | *x[0] + 2 | ... | *x[0]+ny-1 |
x[1] ---> | *x[1] | *x[1]+1 | *x[1] + 2 | ... | *x[1]+ny-1 |
.
.
.
x[nx-1] ---> | *x[nx-1] | *x[nx-1]+1 | *x[nx-1] + 2 | ... | *x[nx-1]+ny-1 |
这相当于:
x[0] ---> | *(*(x+0)+0) | *(*(x+0)+1) | *(*(x+0)+2) | ... | *(*(x+0)+ny-1) |
x[1] ---> | *(*(x+1)+0) | *(*(x+1)+1) | *(*(x+1)+2) | ... | *(*(x+1)+ny-1) |
.
.
.
x[nx-1] ---> | *(*(x+nx-1)+0) | *(*(x+nx-1)+1) | *(*(x+nx-1)+2) | ... | *(*(x+nx-1)+ny-1) |
这相当于:
x[0] ---> | x[0][0] | x[0][1] | x[0][2] | ... | x[0][ny-1] |
x[1] ---> | x[1][0] | x[1][1] | x[1][2] | ... | x[1][ny-1] |
.
.
.
x[nx-1] ---> | x[nx-1][0] | x[nx-1][1] | x[nx-1][2] | ... | x[nx-1][ny-1] |
......考虑到重要的关系:
*( *(x + i) + j) = *( x[i] + j) = x[i][j]
答案 3 :(得分:1)
你可以这样做:
int ArrayName[5][5];
for(size_t i = 0; i < 5; i++)
for(size_t i2 = 0; i2 < 5; i2++)
ArrayName[i][i2] = 1;
或者更高效:
int ArrayName[5][5];
for(size_t i = 0, *ptr = ArrayName; i < (5*5); ++i, ++ptr)
*ptr = 1;
如果你足够疯狂,你可以为它创建一个功能:
void init_arr(void* ptr, void* value, size_t size)
{
for(size_t i = 0; i < size; ++i, ++ptr)
*ptr = *value;
}
int ArrayName[5][5];
int val = 1;
init_arr(ArrayName, val, 5 * 5);
如果您使用的是C ++,则可以使用模板:
template <class T>
void init_arr(T *ptr, T value, size_t size)
{
for(size_t i = 0; i < size; ++i, ++ptr)
*ptr = value;
}
int ArrayName[5][5];
init_arr(ArrayName, 1, 5 * 5);
如果真的使用C ++,你就会使用向量......哎呀,这可能是一种花哨的提升方式。 :)