我在这里有一个代码示例。静态结构和普通结构有什么区别?
struct node {
int data;
struct node *link;
};
static struct node *first = NULL;
如果有人能够对我下面关于静态词的使用问题提出一些疑问,那将是非常棒的。
关键字static在上面的代码中做了什么?
正常结构和静态结构之间有什么区别?
我在这里有一个代码示例。静态结构和普通结构有什么区别?
struct node {
int data;
struct node *link;
};
static struct node *first = NULL;
如果有人能够对我下面关于静态词的使用问题提出一些疑问,那将是非常棒的。
关键字static在上面的代码中做了什么?
正常结构和静态结构之间有什么区别?
它创建一个指向node
的静态指针并将其初始化为NULL
。
变量定义可以有多个含义:
static struct node *first = NULL;
如果方法外定义,它给first
内部联动。它只能在定义模块中使用。
但你也可以找到一个方法内该行:
void foo()
{
static struct node *first = NULL;
}
变量是一个方法范围的变量居住在静态存储。它被初始化为NULL
一次,并且所有后续更改在对该函数的调用之间保持不变。
这就是问题:“静态指针”是什么意思? – 2012-03-06 09:52:01
@KonradRudolph是的,我误解了这个问题。现在编辑。 – 2012-03-06 09:53:50
后一种情况称为“功能范围和静态存储时间”变量,而不是“全局方法范围”。 – 2012-03-06 10:10:18
这意味着这个变量不能用在这个模块之外。
E.g. - 你不能使用
extern struct node *first;
一个重要的注意另一个文件中引用这个指针是,结构也不是一成不变的,只有first
这是一个指针,这样的结构是静态的。
它也可以是一个方法内的静态变量。 – 2012-03-06 09:56:37
@LuchianGrigore - 没错,没有考虑到这一点。 – MByD 2012-03-06 09:57:12
它不影响结构本身的定义。这仅仅意味着结构的特定实例在这里名为first
具有内部连接。
你是不是指内部联动? – 2012-03-06 09:56:09
为什么,我喜欢。 :) – 2012-03-06 10:08:52
全局变量的static关键字使该变量局部于定义模块的位置。即您无法从其他模块访问它。
如果静态变量是在一个函数中定义的,它将保持该变量在调用此函数之间保持活动状态并进行更新。
修改变量时,static关键字指定该变量具有静态持续时间(在程序开始时分配,当程序结束时分配)并将其初始化为0,除非指定了另一个值。在文件范围修改变量或函数时,static关键字指定变量或函数具有内部链接(其名称在声明它的文件外部不可见)。
函数中声明为静态的变量在调用该函数之间保留其状态。
修改类声明中的数据成员时,static关键字指定该成员的一个副本由类的所有实例共享。在类声明中修改成员函数时,static关键字指定该函数仅访问静态成员。
类的静态数据成员必须在文件范围初始化。
在递归代码中,一个静态对象或变量保证在代码块的不同实例中具有相同的状态。
联合的成员不能被声明为静态。全局声明的匿名联合必须明确声明为静态。
默认情况下,在所有块外部定义的对象和变量都具有静态生命周期和外部链接。显式声明为静态的全局对象或变量具有内部链接。
**静态并不意味着。**实际上,它分配在静态存储中,而不是堆或堆栈中。 – 2012-03-06 10:02:54
你的代码中没有'static struct'。它只是'struct node'的静态实例。 – iammilind 2012-03-06 09:52:48
@iammilind:它甚至不是,它是'struct node *'的一个实例。 – 2012-03-06 10:11:08