初始化单值的多维数组

时间:2011-04-11 02:34:57

标签: c

有人能提醒我将C中的数组(特别是多维)分配给单个值的语法吗?

我相信这些波浪形的括号做了这个,虽然我在测试时遇到了编译器错误:

int ArrayName [5][5] = {1};

将数组初始化为1。

4 个答案:

答案 0 :(得分:6)

C语言中没有紧凑的语法可以将数组的所有元素初始化为单个值,无论数组是多维的还是单维的。有一种语法可以将所有元素专门设置为零(并且它是= { 0 }),但对于任何其他值,它是不可能的。

当然,你可以为所有数组元素拼出单独的初始值设定项,但这可能不是你想要的。

您所能做的就是通过使用赋值手动将所有元素设置为特定值。

答案 1 :(得分:1)

我不确定这是否可行。您应该使用forwhile循环。

如果要用单个字节填充内存,可以使用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 ++,你就会使用向量......哎呀,这可能是一种花哨的提升方式。 :)