C/C++ 数组赋值

3

示例代码:

int ar[3];
............
ar[0] = 123;
ar[1] = 456;
ar[2] = 789;

有没有更简短的初始化方式?比如说:
int ar[3];
............
ar[] = { 123, 456, 789 };

我不需要像这样的解决方案:

int ar[] = { 123, 456, 789 };

定义和初始化必须分开。


术语:初始化是在定义时赋值。你想要的是“数组赋值”。 - Kos
5个回答

5
您所要求的无法直接完成。但是,有不同的方法可以实现,从创建使用聚合初始化的本地数组开始,然后将其memcpy到您的数组中(仅适用于POD类型),或者使用更高级别的库,如boost::assign
// option1
int array[10];
//... code
{
   int tmp[10] = { 1, 2, 3, 4, 5 }
   memcpy( array, tmp, sizeof array ); // ! beware of both array sizes here!!
}  // end of local scope, tmp should go away and compiler can reclaim stack space

我没有时间检查如何使用boost::assign,因为我几乎从不使用原始数组。


谢谢。我只是想知道这种语言或编译器扩展中是否存在某种方法。 - kyrylomyr

0

数组可以直接赋值:

int a[3] = {1, 2, 3};

也可以看看C++ 数组教程


我不需要在数组定义后进行初始化。我需要在代码深处初始化数组。 - kyrylomyr
1
@archer:那你为什么不能在需要初始化的时候定义它呢? - Yakov Galka
这个点位于循环内部。也许我错了,但是如果有大量的循环执行,将数组定义在循环外会更优化。 - kyrylomyr
1
你可以用相同的方式进行赋值:a = {1, 2, 3}。但这实际上是C++0x(“扩展初始化列表”)。如果你需要在每个循环迭代中重新分配数组,你仍然可以使用memcpy - AndiDog
2
@archer:那么你几乎肯定是错的。数组在堆栈上的分配只需要进行堆栈指针的加减操作。编译器可能会优化并将其分配到函数的堆栈帧中,就像任何其他变量一样。 - Yakov Galka

0

int a[] = {1,2,3};

这个对你不起作用吗?

main()
{
    int a[] = {1,3,2};

    printf("%d %d %d\n", a[0], a[1], a[2]);
    printf("Size: %d\n", (sizeof(a) / sizeof(int)));

}

打印:

1 3 2
Size: 3

微软C++(VS2010)。您正在使用定义后初始化。我需要分开。 - kyrylomyr
main 没有返回类型!?你在用什么编译器!? - Yakov Galka
@gungalobill:使用gcc 3.3.5,但重点不在于主要部分,而在于数组的使用,快速上手即可 :) - Ass3mbler

0
#include <iostream>

using namespace std;

int main()
{
    int arr[3];
    arr[0] = 123, arr[1] = 345, arr[2] = 567;
    printf("%d,%d,%d", arr[0], arr[1], arr[2]);
    return 0;
}

0

C99数组初始化怎么样?

int array[] = {
   [0] = 5, // array[0] = 5
   [3] = 8, // array[3] = 8
   [255] = 9, // array[255] = 9
};

谢谢你提到这个,但我们并不讨论初始化 :) - Kos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接