5,123
社区成员




static
和extern
都是C语言中的关键字
static
时静态的意思,可以用来:
extern
是用来声明来自外部符号 (符号: 变量,函数…)
static
和extern
之前先讲述一下:作用域和生命周期 1.局部变量的作用域是变量所在的局部范围,其生命周期是其所在函数的生命周期
2.全局变量的作用域是整个工程(项目)[全局范围],其生命周期是整个程序的生命周期
1.局部变量的 生命周期 是:进入作用域变量创建,生命周期 开始,出作用域,生命周期 结束(变量的创建 ---> 变量的销毁)
2.全局变量的生命周期是:整个程序的生命周期
3.程序的生命周期 == main函数的生命周期 == 全局变量的生命周期
问题:这段代码的运行结果?
test
是一个局部函数(它被定义在 main
函数内部),a是一个局部变量,当每次test开始执行时,局部变量a被创建,当test执行结束后,局部变量 a会被销毁(同时局部变量test也会自行销毁),以此反复 static
修饰的对象,在编译阶段就会被创建 static
修饰的局部变量存储在静态区,程序运行期间一直存在,不会因函数调用结束而被销毁。 static
修饰的局部变量只会在第一次执行到定义语句**时被初始化一次,后续函数调用不会再次初始化,且保留上一次函数调用结束时的值 static
所修饰局部变量的作用域仍然是在定义它的函数内部,不能被其他函数直接访问。但由于其存储在静态区,其生命周期延长到整个程序运行期间,因此可以在多次函数调用期间保留数据(改变生命周期,但不会改变作用域(作用域仍在局部函数中),[因此其与全局变量不同]) C++
#include<stdio.h>
void test()
{
static int a = 0;//static修饰局部变量
a++;
printf("%d ", a);
}
int main()
{
for (int i = 0; i < 5; i++)
{
test();
}
return 0;
}
static
所修饰局部变量是改变了变量的生命周期,生命周期改变的本质是改变了变量的存储类型,a(栈区)--->static--->a[静态区]
,存储在静态区的变量与全局变量的生命周期同**,但作用域仍在局部函数test中 static
来修饰 static
修饰的全局变量,只能在本源文件内使用,而无法通过extern
**(或其他途径)在其他源文件中使用。 static
所修饰的全局变量,外部链接属性--->内部链接属性
,只能在自己所在的源文件内部使用,其他源文件即使声明,也无法使用(类似于:**static
** 将全局变量的作用域限制在了本源文件中) static
修饰 C
#include<stdio.h>
//声明来自外部的符号
extern int g_val;
int main()
{
printf("%d ", g_val);
return 0;
}
C
int g_val = 1314;
同样的,被 static
修饰的全局函数:外部链接属性--->内部链接属性
文章来源: https://blog.csdn.net/2401_87692970/article/details/146464056
版权声明: 本文为博主原创文章,遵循CC 4.0 BY-SA 知识共享协议,转载请附上原文出处链接和本声明。