2012-03-06 110 views
5

我在这里有一个代码示例。静态结构和普通结构有什么区别?

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

如果有人能够对我下面关于静态词的使用问题提出一些疑问,那将是非常棒的。

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

  2. 正常结构和静态结构之间有什么区别?

+2

你的代码中没有'static struct'。它只是'struct node'的静态实例。 – iammilind 2012-03-06 09:52:48

+0

@iammilind:它甚至不是,它是'struct node *'的一个实例。 – 2012-03-06 10:11:08

回答

7

它创建一个指向node的静态指针并将其初始化为NULL

变量定义可以有多个含义:

static struct node *first = NULL; 

如果方法外定义,它给first内部联动。它只能在定义模块中使用。

但你也可以找到一个方法内该行:

void foo() 
{ 
    static struct node *first = NULL; 
} 

变量是一个方法范围的变量居住在静态存储。它被初始化为NULL一次,并且所有后续更改在对该函数的调用之间保持不变。

+0

这就是问题:“静态指针”是什么意思? – 2012-03-06 09:52:01

+0

@KonradRudolph是的,我误解了这个问题。现在编辑。 – 2012-03-06 09:53:50

+1

后一种情况称为“功能范围和静态存储时间”变量,而不是“全局方法范围”。 – 2012-03-06 10:10:18

5

这意味着这个变量不能用在这个模块之外。

E.g. - 你不能使用

extern struct node *first; 

一个重要的注意另一个文件中引用这个指针是,结构也不是一成不变的,只有first这是一个指针,这样的结构是静态的。

+0

它也可以是一个方法内的静态变量。 – 2012-03-06 09:56:37

+0

@LuchianGrigore - 没错,没有考虑到这一点。 – MByD 2012-03-06 09:57:12

2

它不影响结构本身的定义。这仅仅意味着结构的特定实例在这里名为first具有内部连接。

+0

你是不是指内部联动? – 2012-03-06 09:56:09

+0

为什么,我喜欢。 :) – 2012-03-06 10:08:52

0

全局变量的static关键字使该变量局部于定义模块的位置。即您无法从其他模块访问它。

如果静态变量是在一个函数中定义的,它将保持该变量在调用此函数之间保持活动状态并进行更新。

0

修改变量时,static关键字指定该变量具有静态持续时间(在程序开始时分配,当程序结束时分配)并将其初始化为0,除非指定了另一个值。在文件范围修改变量或函数时,static关键字指定变量或函数具有内部链接(其名称在声明它的文件外部不可见)。

函数中声明为静态的变量在调用该函数之间保留其状态。

修改类声明中的数据成员时,static关键字指定该成员的一个副本由类的所有实例共享。在类声明中修改成员函数时,static关键字指定该函数仅访问静态成员。

类的静态数据成员必须在文件范围初始化。

在递归代码中,一个静态对象或变量保证在代码块的不同实例中具有相同的状态。

联合的成员不能被声明为静态。全局声明的匿名联合必须明确声明为静态。

默认情况下,在所有块外部定义的对象和变量都具有静态生命周期和外部链接。显式声明为静态的全局对象或变量具有内部链接。

+1

**静态并不意味着。**实际上,它分配在静态存储中,而不是堆或堆栈中。 – 2012-03-06 10:02:54