我这里有一个代码示例。
struct node {
int data;
struct node *link;
};
static struct node *first = NULL;
如果有人能够对我在下面使用静态一词的问题提出一些看法,那将会很棒。
关键字static在上面的代码中做了什么?
正常结构与静态结构有什么区别?
答案 0 :(得分:7)
它会创建一个指向node
的静态指针,并将其初始化为NULL
。
变量定义可以有多种含义:
static struct node *first = NULL;
如果在方法之外定义,则会提供first
内部链接。它只能在定义模块中使用。
但你也可以在方法中找到该行:
void foo()
{
static struct node *first = NULL;
}
变量是驻留在静态存储中的方法范围变量。它被初始化为NULL
一次,所有后续更改在对函数的调用之间保持不变。
答案 1 :(得分:5)
这意味着此变量可能不在此模块之外使用。
E.g。 - 您无法使用
从其他文件引用此指针extern struct node *first;
一个重要的注意事项是结构不是静态的,只有first
是指向这种结构的指针是静态的。
答案 2 :(得分:2)
它不会影响结构本身的定义。它只是意味着此处名为first
的结构的特定实例具有内部链接。
答案 3 :(得分:0)
全局变量的static关键字使变量本地化为定义它的模块。即你不能从另一个模块访问它。
如果静态变量是在函数中定义的,它会使变量保持活动状态,并在对此函数的调用之间进行更新。
答案 4 :(得分:0)
当修改变量时,static关键字指定变量具有静态持续时间(在程序开始时分配,在程序结束时释放)并将其初始化为0,除非指定了另一个值。在文件范围修改变量或函数时,static关键字指定变量或函数具有内部链接(其名称在声明它的文件外部不可见)。
在函数中声明为static的变量在对该函数的调用之间保持其状态。
在类声明中修改数据成员时,static关键字指定该类的所有实例共享该成员的一个副本。在类声明中修改成员函数时,static关键字指定该函数仅访问静态成员。
类的静态数据成员必须在文件范围初始化。
在递归代码中,静态对象或变量保证在代码块的不同实例中具有相同的状态。
union的成员不能声明为static。全局声明的匿名联合必须显式声明为static。
默认情况下,在所有块外部定义的对象和变量具有静态生存期和外部链接。显式声明为static的全局对象或变量具有内部链接。