静态结构和正常结构有什么区别?

时间:2012-03-06 09:47:13

标签: c++ c static structure

我这里有一个代码示例。

struct node { 
        int data;
        struct node *link;
    };
    static struct node *first = NULL;

如果有人能够对我在下面使用静态一词的问题提出一些看法,那将会很棒。

  1. 关键字static在上面的代码中做了什么?

  2. 正常结构与静态结构有什么区别?

5 个答案:

答案 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的全局对象或变量具有内部链接。