在c和c ++的上下文中静态,自动,全局和局部variables之间的区别
我对静态,自动,全局和局部variables有点困惑。 在某处我读到一个静态variables只能在函数中被访问,但是在函数返回后它们仍然存在(保留在内存中)。 不过,我也知道一个局部variables也是这样,所以有什么区别?
这里有两个单独的概念:
- 范围 ,它决定了名字可以被访问的地方
- 存储持续时间 ,决定何时创build和销毁variables。
局部variables(迂回地, 块variables的variables)只能在声明它们的代码块中访问:
void f() { int i; i = 1; // OK: in scope } void g() { i = 2; // Error: not in scope }
全局variables(迂回地, 文件范围 (C)或名称空间范围 (C ++)中的variables)可以在声明后的任何时间点访问:
int i; void f() { i = 1; // OK: in scope } void g() { i = 2; // OK: still in scope }
(在C ++中,情况比较复杂,因为命名空间可以被closures和重新打开,而且可以访问除当前命名空间之外的其他作用域,并且名称也可以具有类作用域,但这已经变得非常焦虑了。
自动variables(迂回地,具有自动存储持续时间的variables)是当执行离开它们的作用域时其生存期终止的局部variables,并且当作用域被重新进入时被重新创build。
for (int i = 0; i < 5; ++i) { int n = 0; printf("%d ", ++n); // prints 1 1 1 1 1 - the previous value is lost }
静态variables(迂回地,具有静态存储持续时间的variables)的寿命一直持续到程序结束。 如果它们是局部variables,那么当执行离开它们的范围时,它们的值将保持不变。
for (int i = 0; i < 5; ++i) { static int n = 0; printf("%d ", ++n); // prints 1 2 3 4 5 - the value persists }
请注意,除静态存储时间外,static关键字具有各种含义。 在一个全局variables或函数上,它给了它内部的连接,以至于不能从其他翻译单元访问; 在C ++类成员上,这意味着每个类只有一个实例,而不是每个对象一个。 另外,在C ++中, auto
关键字不再意味着自动存储持续时间; 它现在意味着自动types,从variables的初始化中推导出来。
首先我说你应该谷歌这个,因为它是在很多地方详细定义
本地
这些variables只存在于创build它们的特定函数中。 他们不知道其他function和主程序。 因此,它们通常使用堆栈来实现。 一旦创build它们的函数完成,局部variables就不复存在。 每次执行或调用函数时都会重新创build它们。
全球
这些variables可以通过构成程序的任何函数访问(即已知)。 它们通过将内存位置与variables名称关联来实现。 如果function被召回,则不会被重新创build。
/* Demonstrating Global variables */ #include <stdio.h> int add_numbers( void ); /* ANSI function prototype */ /* These are global variables and can be accessed by functions from this point on */ int value1, value2, value3; int add_numbers( void ) { auto int result; result = value1 + value2 + value3; return result; } main() { auto int result; value1 = 10; value2 = 20; value3 = 30; result = add_numbers(); printf("The sum of %d + %d + %d is %d\n", value1, value2, value3, final_result); } Sample Program Output The sum of 10 + 20 + 30 is 60
仔细放置声明可以限制全局variables的范围。 它们从声明中可见,直到当前源文件结束。
#include <stdio.h> void no_access( void ); /* ANSI function prototype */ void all_access( void ); static int n2; /* n2 is known from this point onwards */ void no_access( void ) { n1 = 10; /* illegal, n1 not yet known */ n2 = 5; /* valid */ } static int n1; /* n1 is known from this point onwards */ void all_access( void ) { n1 = 10; /* valid */ n2 = 3; /* valid */ }
静态的:
静态对象是一个从构造到构造结束时一直存在的对象。 所以堆栈和堆对象被排除在外。 但是全局对象,名称空间范围内的对象,在类/函数内部声明为静态的对象以及在文件范围内声明的对象都包含在静态对象中。 程序停止运行时,静态对象被销毁。
我build议你看看这个教程列表
汽车:
C,C ++
(称为自动variables。)
在一个代码块中声明的所有variables默认是自动的,但是可以用auto关键字来明确指定。[注1]一个未初始化的自动variables有一个未定义的值,直到它被赋予一个有效的types值。
使用存储类寄存器而不是自动提示编译器将该variablescaching在处理器寄存器中。 除了不允许在variables或其任何子组件上使用引用操作符(&)之外,编译器可以自由忽略该提示。
在C ++中,自动variables的构造函数在执行到达声明的地方时被调用。 当到达给定程序块的末尾时调用析构函数(程序块被大括号包围)。 这个function经常被用来pipe理资源的分配和释放,比如打开然后自动closures文件或者释放内存。 看WIKIPEDIA
区别在于静态variables是那些variables:它允许一个值从一个函数调用保留到另一个。 但在局部variables的情况下,范围是直到块/函数的生命周期。
例如:
#include <stdio.h> void func() { static int x = 0; // x is initialized only once across three calls of func() printf("%d\n", x); // outputs the value of x x = x + 1; } int main(int argc, char * const argv[]) { func(); // prints 0 func(); // prints 1 func(); // prints 2 return 0; }
在函数终止之后,局部variables在内存中是不存在的。
然而, static
variables在程序的整个生命周期中仍然保留在内存中,而不pipe函数是什么。
另外从你的问题来看, static
variables可以在class
或函数范围本地声明,并且在namespace
或文件范围内全局声明。 它们从头到尾分配内存,只是迟早发生的初始化。
static
在C和C ++中是一个严重超载的单词。 函数上下文中的static
variables是在调用之间保存其值的variables。 他们存在的程序期间。
局部variables仅在函数的生命周期或其封闭范围内持续存在。 例如:
void foo() { int i, j, k; //initialize, do stuff } //i, j, k fall out of scope, no longer exist
有时候,这个范围是有目的地使用{ }
块:
{ int i, j, k; //... } //i, j, k now out of scope
全局variables在程序期间存在。
在C和C ++中, auto
现在是不同的。 C中的auto
是一个(多余的)指定局部variables的方法。 在C ++ 11中, auto
现在被用来自动派生一个值/expression式的types。
当一个variables在一个类中声明为静态时,它就变成了该类所有对象的共享variables,这意味着该variables对于任何对象来说都是更长的。 例如: –
#include<iostream.h> #include<conio.h> class test { void fun() { static int a=0; a++; cout<<"Value of a = "<<a<<"\n"; } }; void main() { clrscr(); test obj1; test obj2; test obj3; obj1.fun(); obj2.fun(); obj3.fun(); getch(); }
这个程序会产生以下输出:
Value of a = 1 Value of a = 2 Value of a = 3
全局声明的静态variables也是如此。 上面的代码将生成相同的输出,如果我们声明variables一个外部函数void fun()
鉴于如果你删除关键字静态和声明一个非静态的本地/全局variables那么输出将如下: –
Value of a = 1 Value of a = 1 Value of a = 1