0

假设我每次调用 f() 时都想做这样的事情来增加一个 int 数组:

void f()
{
  static int v[100]={1,2,3...100};
  for (int i=0; i<100; i++) v[i]++;
}

即我想要:

first call f(): v[100]={1,2,3...100};
second call f(): v[100]={2,3,4...101};
...

显然以下不会这样做:

void f()
{
  static int v[100]; for (int i=0; i<100; i++) v[i]=i+1;
  for (int i=0; i<100; i++) v[i]++;
}

不知道如何实现它。谢谢!

4

3 回答 3

2

函数内部声明的static数组只能在函数内部被引用,只要程序运行它就存在。它可以在您在第一个版本中提示时进行初始化。

第二个版本首先用值填充数组,然后在每次调用函数时递增它们。大概不是你想要的。

要么将初始化和递增拆分为两个函数,static在两者之外定义数组,要么像第一个版本一样手动填充数组(甚至可以编写一个程序来生成初始化数组的部分到文件中,然后将其复制到你的来源)。在这种情况下,数组的填充是由编译器完成的,没有运行时损失。

于 2013-03-02T04:06:01.983 回答
1

您可以使用另一个包含数组标记或起点的静态变量来执行此操作。说

{
    static int fst = 0,
        v[MAXSIZE] = {0};    //#define MAXSIZE 100
        fst++;
        for(int i = 0; i < (MAXSIZE+fst-1); i++) v[i] = i + fst;
}
于 2013-03-02T04:24:30.330 回答
0

你不能像那样初始化你的静态数组。第二个代码块中的第一个 for 循环只会在每次被调用时f被调用。

您可以将静态v变量初始化为 NULL,然后在实际递增数组元素的 for 循环之前,检查 NULL 并i+1在必要时进行初始化。

于 2013-03-02T04:02:51.857 回答