C/C++ 关于static
static关键字在c/c++中的作用无非修饰三种类型。
- 修饰局部变量
- 修饰全局变量
- 修饰函数
1、static修饰局部变量
被static修饰过得局部变量,叫做静态局部变量,只会被赋一次初值,系统会把该变量在静态存储区开辟一块空间。不像一般的变量,开辟在堆栈区,系统用完就把空间释放了,但是static修饰过的局部变量,程序调用完不会立刻释放。会等到程序执行完再释放。但其作用域并不会改变,但是其生命周期会延长至程序结束。
首先看静态局部变量只会被赋值一次
#include<stdio.h>
void test1()
{
static int a=10;
int b=10;
printf("a=%d\n",a);
a++;
printf("b=%d\n",b);
b++;
}
int main()
{
for(int i=0;i<4;i++)
{
test1();
}
}
程序运行结果如下图:
由图一结果发现,静态局部变量只会被初始化一次。
下面再看静态局部变量的生命周期延长了,但是作用域并没有改变。
由图二发现报错,说明静态局部变量作用域未被改变。
但是怎么查看其生命周期有没有改变呢;看下边代码。
#include<stdio.h>
int *p=NULL;
int *q=NULL;
void test1()
{
static int a=10;
int b=9;
p=&a;
q=&b;
}
int main()
{
test1();
printf("a=%d\n",*p);
printf("b=%d\n",*q);
}
执行结果:
再看执行结果发现a的值没有改变,而b的值已经发生了改变。这是因为a变量被static修饰了,其地址空间并没有被释放,其它变量不能占用这一块空间,而反观b,其地址空间已经被释放了,所以其它变量可以占用这一块地址空间,因此b的值发生了改变。
还有关于static修饰类成员变量、结构体成员变量,其实和局部变量原理一样。
大家可以参考一下这篇文章:
https://blog.csdn.net/z_x_m_m_q/article/details/82502162
2、static修饰全局变量
static修饰的全局变量,其作用域被改变了,如果全局变量不被static修饰,那么这个全局变量可以在其它文件里面使用,但是加上static关键字,那么这个变量就不可以在其它文件中使用了。但是它的生命周期不会发生改变。
//文件1
#ifndef _EXP_H_
#define _EXP_H_
#include<stdio.h>
void print();
#endif
//文件2
#include"exp.h"
int overall=100; //对比量
static int ovErall=200; //被测量
void print()
{
printf("66\n");
}
//文件3
#include<stdio.h>
#include"exp.h"
extern int overall;
extern int ovErall;
int main()
{
printf("overall=%d\n",overall);
printf("ovErall=%d\n",ovErall);//注释掉此行程序不报错
}
3、static修饰函数
static修饰函数与修饰全局变量效果一样
//文件1
#ifndef _EXP_H_
#define _EXP_H_
#include<stdio.h>
void print1();
static void print2();
#endif
//文件2
#include"exp.h"
void print1()
{
printf("66\n");
}
static void print2()
{
printf("99");
}
文件3
#include<stdio.h>
#include"exp.h"
int main()
{
print1();
//print2(); //注释掉此行函数正常运行,否则报错。
}
运行结果: