有人能让我想起将C中的数组,特别是多维数组赋给单个值的语法吗?初始化单值多维数组
我相信花括号做到这一点,虽然我收到一个编译器错误,当我测试:
int ArrayName [5][5] = {1};
到数组初始化为1
有人能让我想起将C中的数组,特别是多维数组赋给单个值的语法吗?初始化单值多维数组
我相信花括号做到这一点,虽然我收到一个编译器错误,当我测试:
int ArrayName [5][5] = {1};
到数组初始化为1
我不知道这是不可能的。您应该使用for
或while
循环。
如果您想用单个字节填充内存,则可以使用memset
函数。
使用int ArrayName [5] [5] = {1};'是合法的,[但它不会做你期望的事情](http://stackoverflow.com/q/201101/365102)。 – 2011-04-11 02:47:58
多维数组可以使用 指针与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]
我无法看到答案和问题之间的联系.... – AnT 2011-04-11 04:48:44
你可以这样做:
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++,你会用向量......哎呀,有可能是一个花哨的升压方式做到这一点。 :)
C语言中没有简洁的语法,它可以将数组的所有元素初始化为单个值,而不管该数组是多维还是单维。有语法可以将所有元素都设置为零(并且它是= { 0 }
),但对于任何其他值都是不可能的。
当然,你可以拼出所有数组元素的单个初始值设定项,但这可能不是你要找的。
您所能做的就是手动将所有元素设置为特定值,方法是使用赋值。
你会得到什么错误? – SLaks 2011-04-11 02:38:51
[扩大阅读。](http://stackoverflow.com/q/201101/365102) – 2011-04-11 02:43:45
随着花括号花括号,你应该为数组的每个成员提供一个单独的值(缺失值设置为0)。因为它很容易理解,所以我会选择Elalfer的答案。另一方面,如果你有C++可用,向量可以初始化为同一个值的多个副本(尽管这可能会与多维度混乱)。另一方面请注意:如果您在堆上分配内存,则可以使用calloc而不是malloc来将内存初始化为0. – 2011-04-11 02:56:21