2011-04-11 122 views
4

有人能让我想起将C中的数组,特别是多维数组赋给单个值的语法吗?初始化单值多维数组

我相信花括号做到这一点,虽然我收到一个编译器错误,当我测试:

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

到数组初始化为1

+1

你会得到什么错误? – SLaks 2011-04-11 02:38:51

+0

[扩大阅读。](http://stackoverflow.com/q/201101/365102) – 2011-04-11 02:43:45

+1

随着花括号花括号,你应该为数组的每个成员提供一个单独的值(缺失值设置为0)。因为它很容易理解,所以我会选择Elalfer的答案。另一方面,如果你有C++可用,向量可以初始化为同一个值的多个副本(尽管这可能会与多维度混乱)。另一方面请注意:如果您在堆上分配内存,则可以使用calloc而不是malloc来将内存初始化为0. – 2011-04-11 02:56:21

回答

1

我不知道这是不可能的。您应该使用forwhile循环。

如果您想用单个字节填充内存,则可以使用memset函数。

+0

使用int ArrayName [5] [5] = {1};'是合法的,[但它不会做你期望的事情](http://stackoverflow.com/q/201101/365102)。 – 2011-04-11 02:47:58

1

多维数组可以使用 指针与malloc动态构建。在下面的例子中,声明了一个指针指向int的指针 。在声明后,指针 没有意义。到mallac然后调用请求 指针指向的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). 

为了让eachof这些指针有意义的值, 我们可以调用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)); 
    } 

现在我们的指针数组中的每个指针都指向一个有意义的内存块(每个大小为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] 
+4

我无法看到答案和问题之间的联系.... – AnT 2011-04-11 04:48:44

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); 

如果你w用C++ ERE,您可以使用模板:

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++,你会用向量......哎呀,有可能是一个花哨的升压方式做到这一点。 :)

6

C语言中没有简洁的语法,它可以将数组的所有元素初始化为单个值,而不管该数组是多维还是单维。有语法可以将所有元素都设置为零(并且它是= { 0 }),但对于任何其他值都是不可能的。

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

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