用static关键字声明的数组:什么是static,指针还是整个数组?

时间:2011-01-13 20:25:44

标签: c arrays pointers static

简单但棘手的问题:

void f() {
    static int a[3] = {1, 2, 3};
    ...

这里的静态是什么?指向数组的指针还是整个数组?

有人能指出我在C标准中的定义吗?

谢谢!

3 个答案:

答案 0 :(得分:6)

根据ISO C99标准(第6.2.1节“标识符的范围”):

  

3如果声明文件范围   对象或函数的标识符   包含存储类   说明符静态,标识符有   内部联系.22)

在您的示例中,a标识符变为静态(即,不导出目标文件中的符号)。

编辑:

对于非文件范围的静态声明(第6.2.4节“对象的存储持续时间”)

  

3标识符为的对象   用外部或内部声明   联系,或与存储类   说明符static具有静态存储   持续时间。它的一生就是整个   程序的执行及其执行   存储值只初始化一次,   在程序启动之前。

我认为这意味着数组本身在这种情况下变为静态,这是有道理的,因为标识符将具有无效内容。

答案 1 :(得分:2)

在代码中:

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

a的类型不是指针,而是int的数组。但是,它会自动转换为指针,例如在C标准中:

除非它是sizeof运算符或一元&运算符的操作数。运算符,或者是用于初始化数组的字符串文字,具有类型''数组类型''的表达式将转换为类型为''指向类型'的指针的表达式,指向数组对象的初始元素,不是左值。

因此,如果a是数组,则= {1,2,3}是初始化,而不是某种单独的数组。我不知道它是否确切地指定了某个地方,但从这个意义上说,它在整个标准中使用。

编辑以消除一些读者的困惑:根据引用标准,如果你写:

int arr[4] = { };
arr[0] = 1; //arr here has here type int*
size_t sz = sizeof(arr); //here it is not type int*, sizeof is exception

答案 2 :(得分:2)

它适用于数组。代码中没有指针。数组不是指针。

#include <stdlib.h>
#include <stdio.h>

void f() {
    static int a[3] = {1, 2, 3};
        a[1]++;
        printf("%d\n", a[1]);
}

main()
{
        int i;
        for (i = 0; i < 5; i++)
        {
                f();
        }
}

输出

3
4
5
6
7