【问题标题】:C/C++ arrays assignmentC/C++ 数组赋值
【发布时间】:2010-12-25 12:55:05
【问题描述】:

示例代码:

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

有什么方法可以缩短它的初始化时间吗?比如:

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

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

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

定义和初始化必须分开。

【问题讨论】:

  • 术语:初始化是在定义时给出一个值。你想要的是“数组赋值”。

标签: c++ c arrays initialization variable-assignment


【解决方案1】:

您所要求的不能直接完成。但是,您可以在那里做不同的事情,从创建使用聚合初始化初始化的本地数组开始,然后在您的数组上使用memcpy-ed(仅对 POD 类型有效),或使用更高级别的库,如 @987654322 @。

// 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 执行此操作,因为我几乎不使用原始数组。

【讨论】:

  • 谢谢。我只是认为这种语言或编译器扩展中存在某种方式。
【解决方案2】:

数组可以直接赋值:

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

也检查C++ Arrays tutorial

【讨论】:

  • 数组定义后不需要初始化。我需要在代码中更深入地初始化数组。
  • @archer:那为什么不能在需要初始化的时候定义呢?
  • 这个点位于循环中。也许我弄错了,但是随着大量循环的执行,将更加优化以在此循环之外定义数组。
  • 你可以用同样的方式分配它:a = {1, 2, 3}。但这实际上是 C++0x(“扩展初始化列表”)。如果需要在每次循环迭代中重新分配数组,仍然可以使用memcpy
  • @archer:那你几乎肯定是错的。堆栈上的数组分配只需堆栈指针加/减。编译器可以像任何其他变量一样在函数的堆栈帧中优化和分配它。
【解决方案3】:

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)。您在定义后使用初始化。我需要分开。
  • main 没有返回类型!?你用的是什么编译器!?
  • @ybungalobill: gcc 3.3.5 但重点不是主要的而是数组的使用,赶紧放上来吧:)
【解决方案4】:

C99 数组初始化呢?

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

【讨论】:

  • 感谢您提及这一点,但我们不是在讨论初始化 :)
【解决方案5】:
#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;
}

【讨论】:

    猜你喜欢
    • 2015-10-10
    • 2023-04-05
    • 2011-05-06
    • 2019-12-17
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-07
    相关资源
    最近更新 更多