2013-11-20 176 views
0

所以在我的C文件我有一个变量:静态变量

static int32_t currentAddress = 0x00000000; 

我在想,如果我用currentAddress设置比如说一个结构中的字段为0 然后说我增加currentAddress别处, A内的领域也会改变吗?

基本上我不明白什么静态在这种情况下,以及何时使用它。

+2

C'static'只是一个范围操作符,变量'currentAddress'只在当前文件中可见。如果'struct A'中的字段是'int32_t',那么如果修改'currentAddress',它将不会改变。 –

+0

最好不要有静态变量。 – piokuc

+1

对不起......为什么最好不要有静态变量?也许你的意思是最好不要有模块级变量。但是如果你想拥有它们,有充足的理由选择它们是静态的。 –

回答

2

A内的字段将获得currentAddress的当前值,即0。稍后更改currentAddress不会影响A的字段,除非您再次为该字段指定currentAddress,此时A的字段将具有currentAddress的新值。

声明者static设置变量currentAddress的作用域和生命周期。您没有指定currentAddress是在文件范围内还是在函数内。无论哪种方式,变量将保留其值,除非您修改它。

+0

它在文件范围内。谢谢! –

1

如果您提到,valie会从currentAddress复制到您要分配给的变量中。所以,改变currentAddress的值,不会改变其他值。

在C中,静态限制变量对当前翻译单元的可见性(简单来说,在当前源文件中,如果项目有多个源文件)。另外,它不会在退出其范围时销毁变量,因为它会发生在非静态变量中。例如:

int foo(){ 
    int a = 0; 
    a++; 
    return a; 
} 

int bar(){ 
    static int a = 0; 
    a++; 
    return a; 
} 

对foo()的每次调用返回1,因为变量a被创建,递增,返回并被销毁。但是,每次调用bar()都会增加返回的值(第一次返回1,然后是2,3,4等等),因为变量不会被销毁。另请注意,变量访问规则将被保留:bar栏中的a栏不能被访问。