让我们说我宣布并初始化
int a[3] = {1, 2, 3};
我怎么能一下子把整个阵列一下子?即。
a = {3, 2, 1};
答案 0 :(得分:13)
如果您的c编译器支持复合文字,您可以使用memcpy
:
memcpy(a, (int[]){3, 2, 1}, sizeof a);
如果你不打算在那里插入任何变量(你可以; C99不是很神奇吗?),(int[])
可以用(const int[])
代替,将文字放入静态内存。 / p>
答案 1 :(得分:4)
复合文字是ANSI C(C99)的一部分。由于它是语言的一部分,任何声称符合C99的编译器都必须支持这一点:
memcpy(a,(int []){3,2,1},sizeof a);
可以将gcc调用为“gcc -Wall -W -std = c99 -pedantic”来指定标准。
由于距离C99已超过11年,我认为开始使用该语言提供的新功能是安全的,也许是一个好主意。
复合文字在n869.txt
的第6.5.2.5节中讨论答案 2 :(得分:3)
你不能;如果值完全相同(并且每个元素都是一个字节大),你需要使用类似memset
的东西,或者如果它们不是一个大字节,那么你需要使用简单的for循环,如果数字可以是计算。如果无法在运行时计算这些值,则需要像a[x] = y;
一样手动完成每个值。
它们被称为“初始化列表”的原因是因为它们可用于初始化某些内容,并且按定义初始化只发生一次。
答案 3 :(得分:1)
你做不到。数组只能从声明器初始值设定项中的大括号表达式初始化。您分配数组。
在C89中甚至没有“临时阵列”这样的东西,尽管从C99开始这些依据compound literals存在(参见@ Dave的回答)。
答案 4 :(得分:1)
这是一种不可移植的方式,严格来说,也可能涉及未定义的行为:
#include <stdio.h>
#include <string.h>
int main(void)
{
int a[3] = { 1, 2, 3 };
printf("%d,%d,%d\n", a[0], a[1], a[2]);
// assuming ints are 4-bytes-long, bytes are 8-bit-long and
// the byte order in ints is from LSB to MSB (little-endian):
memcpy(a, "\x03\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00", sizeof(a));
printf("%d,%d,%d\n", a[0], a[1], a[2]);
return 0;
}
输出:
1,2,3
3,2,1