全局变量、静态全局变量、局部变量和静态局部变量

全局变量

对于全体程序代码可见的变量,想要在跨模块中使用时,往往需要用extern进行声明

静态全局变量

用static关键字声明的全局变量

局部变量

在函数体内定义的自动变量

静态局部变量

用static关键字声明的局部变量

考虑如下代码:

int ik = 1;//为了好说明,在下面称其为ik1
int fun(int i){
static int k = 2;
k++;
return ++k*i++;
}
int main(){
int x = 5;
{
    int ik = 2;//为了好说明,在下面称其为ik2
    x += fun(ik);
            cout<<"The first X = "<<x<<endl;
}
x += fun(ik);
cout <<"The second X = "<<x<<endl;
return 0;
}

以上代码包含了全局变量int ik = 1;,在这里称为ik1;局部变量int ik = 2;,在这里称为ik2;还有静态局部变量static int k = 2;.上面程序的运行可以如下解释:

--->1.进入main函数开始,遇到局部变量定义X,然后在一个小模块内定义一个局部变量ik2(大括号圈起来的范围可以看成一个封闭的模块)

--->2.第一次调用 fun() 函数,ik2起作用,传入fun中的值为2,此时返回的值为13注意!记住这里静态局部变量k的值为4

在局部变量所在的块或者函数内,对变量的操作不影响全局变量的值,全局变量不起作用,在局部变量所在的代码块或函数外部,全局变量才起作用。

--->3.出了大括号之后,第二次调用fun(),值得注意这里,因为ik2的定义在上一对大括号圈起来了,一旦出了大括号之后,ik2的生命周期就结束了,所以这里的“ik”使用的将是全局变量ik1,所以传入的是1。另外,因为fun()中的k是一个静态局部变量,所以将采用上一次调用fun()k的值来作为这次调用的k的初值,为4,所以得到的最终返回结果是19

运行结果

请特别注意如果包裹ik2的大括号去掉如下:

int ik = 1;//为了好说明,在下面称其为 ik1
int fun(int i){
static int k = 2;
k++;
return ++k*i++;
}
int main(){
int x = 5;
int ik = 2;//为了好说明,在下面称其为 ik2
x += fun(ik);
cout<<"The first X = "<<x<<endl;
x += fun(ik);
cout <<"The second X = "<<x<<endl;
return 0;
}

那么ik2的生存周期将是整个mian()函数的范围,则,两次调用都采用的是局部变量ik2的值,得到结果如下:

运行结果

静态存储方式是指在程序运行期间分配固定的存储空间的方式,动态存储方式是在程序运行期间根据需要进行动态的分配存储空间的方式。全局变量静态全局变量静态局部变量都是在静态存储区(全局数据区)中分配空间的,而局部变量是在栈上分配空间的。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容