简单,但棘手的问题:使用static关键字声明的数组:static是什么,指针或整个数组?
void f() {
static int a[3] = {1, 2, 3};
...
什么是静态的吗?指向数组或整个数组的指针?
任何人都可以指出我在C标准中的定义吗?
谢谢!
简单,但棘手的问题:使用static关键字声明的数组:static是什么,指针或整个数组?
void f() {
static int a[3] = {1, 2, 3};
...
什么是静态的吗?指向数组或整个数组的指针?
任何人都可以指出我在C标准中的定义吗?
谢谢!
从ISO C99标准(第6.2.1节“标识符的作用域”):
3如果一个文件范围 标识符对象或功能 的声明包含存储类 符静态的,标识符具有 内部linkage.22)
在您的例子它的a
标识符变为静态的(即,目标文件中的符号未导出)。
编辑:
对于非文件范围静态声明(第6.2.4节,“对象的存储持续时间”)
3,其标识符与外部或内部联动 声明 一个目的,或者与存储级 说明符static有静态存储 持续时间。它的使用寿命是整个 程序的执行,其 存储值在程序启动前仅初始化一次, 。
我认为这意味着在这种情况下数组本身变为静态,这是有道理的,因为否则标识符将具有无效内容。
在代码:
static int a[3] = {1, 2, 3};
键入一个不指针,但为int阵列。然而,它被自动转换成指针,例如,在C标准中:
除非它是sizeof运算符或一元运算符的操作数,或者是用于初始化数组的字符串文字,则具有类型'''数组类型'的表达式将转换为类型为''指向类型''的表达式指向数组对象的初始元素,并且不是左值。
所以,如果一个数组,比= {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
它适用于阵列。代码中没有指针。数组不是指针。
#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
你指的是什么指针? – 2011-01-13 20:33:35
我指的是“a”指针(&a [0])。 – Silas 2011-01-13 20:34:49
在几乎所有情况下`a`扩展的表达式&a [0]不是左值。它是一个地址而不是指针。只有一个标识符被定义,这是数组。由于没有其他标识符,所以没有什么可以应用`static`。 – 2011-01-13 20:43:24