大家好,欢迎来到IT知识分享网。
static关键字详解——静态的
放在最前面的
🎈 🎈 我的CSDN主页:OTWOL的主页,欢迎!!!👋🏼👋🏼
🎉🎉我的C语言初阶合集:C语言初阶合集,希望能帮到你!!!😍 😍
👋🏼🎉🎊创作不易,欢迎大家留言、点赞加收藏!!! 🥳😁😍
1、前言
1、static是用来修饰变量和函数的
2、变量有局部变量、全局变量之分
2、补充计算机的内存分布
(1)主要分为三个区
⼀般我们在学习C/C++语⾔的时候,
我们会关注 内存中的三个区域:
1、栈区、
2、堆区、
3、静态区
1.局部变量是放在内存的 栈区
2. 全局变量是放在内存的 静态区
3. 堆区是⽤来 动态内存管理 的
(2)内存分布的图片展示
图片1
图片2
3、static修饰变量和函数
3.1、修饰局部变量
(1)无static关键字修饰
- 代码1展示
#include<stdio.h> //定义一个函数,函数名字是 test // void 表示该函数 返回值是空 void test() {
//定义整型变量 a,并进行初始化 int a = 0; //变量 a 自增 1 a++; //输出打印 a 的值 printf("%d\n", a); } int main() {
//定义循环控制变量 i,并进行初始化 int i = 0; //循环并调用 test()函数 while (i < 10) {
//调用函数 test test(); //循环控制变量 i 自增 1 i++; } return 0; }
- 输出结果
- 原因:
普通的局部变量是放在栈区 上的, 这种局部变量进入作用域创建,出了作用域就释放;
即每次进入 test() 函数,a 的值都会重新赋值为0,
(int a = 0;)
(2)有static关键字修饰 – 称为静态局部变量
- 代码2展示
//定义一个函数,函数名字是 test // void 表示该函数 返回值是空 void test() {
// static 修饰局部变量 static int a = 0; //变量 a 自增 1 a++; //输出打印 a 的值 printf("%d\n", a); } int main() {
//定义循环控制变量 i,并进行初始化 int i = 0; //循环并调用 test()函数 while (i < 10) {
//调用函数 test test(); //循环控制变量 i 自增 1 i++; } return 0; }
- 输出结果
- 原因:
但是局部变量被 static 修饰后,这种变量就放在 静态区 ,
放在静态区的变量,创建好后,直到程序结束才释放。
本质上:static 的修饰改变了局部变量的存储位置,
因为存储位置的差异,使得执行效果就不一样。
注意:
被 static修饰是不影响作用域的!!!
但是生命周期发生了变化,变长了。
3.2、修饰全局变量
(1)无static关键字修饰
代码3
//放在 add.c 这个源文件中 //定义一个整型变量 g_val , 并进行初始化 int g_val = 2024;
代码4
//放在 static.c 这个源文件中 //声明外部符号 extern int g_val; #include<stdio.h> int main() { //输出打印变量 g_val 的数值 printf("%d\n", g_val); return 0; }
注意:
上面的代码3 和 代码4 是放在不同的源文件中 ,
所以在 static.c 这个源文件中,
printf 库函数要输出打印 g_val要先声明外部符号 即extern int g_val;
- 输出结果
(2)有static关键字修饰 – 称为静态全局变量
代码5
//放在 add.c 这个源文件中 //定义一个整型变量 g_val ,并进行初始化 // static 修饰全局变量 static int g_val = 2024;
代码6
//放在 static.c 这个源文件中 //声明外部符号 extern int g_val; #include<stdio.h> int main() { //输出打印变量 g_val 的数值 printf("%d\n", g_val); return 0; }
注意:
上面的代码5 和 代码6 是放在不同的源文件中 ,
所以在 static.c 这个源文件中,
printf 库函数要输出打印 g_val要先声明外部符号 即extern int g_val;
- 输出结果 报错!
- 原因:
全局变量本身是具有外部链接属性的,
在A文件中定义的变量,在B文件中也可以通过【链接】使用,
但是如果全局变量被 static修饰,
这个外部链接属性就变成了内部链接属性,
这个全局变量只能在自己所在的源文件内部使用。
static的修饰,会把外部链接属性变成内部链接属性,
最终使得全局变量的作用域变小了。
3.3、修饰函数
(1)无static关键字修饰
代码7
//放在 add.c 这个源文件中 //定义一个函数 int Add(int x, int y) { return x + y; }
代码8
//放在 static.c 这个源文件中 //声明外部函数 extern int Add(int, int); #include<stdio.h> int main() { //定义两个变量 a b,并进行初始化 int a = 10; int b = 10; //调用函数,将返回值赋给变量 c int c = Add(a,b); //打印输出c printf("%d\n", c); return 0; }
注意:
上面的代码7 和 代码8 是放在不同的源文件中 ,
所以在 static.c 这个源文件中,
函数调用时 要先声明外部符号 即extern int Add(int, int);
- 输出结果
(2)有static关键字修饰 – 称为静态函数
代码9
//放在 add.c 这个源文件中 //定义一个函数 // static 修饰函数 static int Add(int x, int y) { return x + y; }
代码10
//放在 static.c 这个源文件中 //声明外部函数 extern int Add(int, int); #include<stdio.h> int main() { //定义两个变量 a b,并进行初始化 int a = 10; int b = 10; //调用函数,将返回值赋给变量 c int c = Add(a,b); //打印输出 c 的数值 printf("%d\n", c); return 0; }
注意:
上面的代码9 和 代码10 是放在不同的源文件中 ,
所以在 static.c 这个源文件中,
函数调用时 要先声明外部符号 即extern int Add(int, int);
- 输出结果 报错!
- 原因:
函数本身是具有外部链接属性的 被 static 修饰后,
外部链接属性就变成了内部链接属性
使得这个函数只能在自己所在的源文件内部使用,
其他的源文件无法使用 即限制了作用域。
4、总结
(1)static 修饰局部变量 称为静态局部变量
static修饰 局部变量 时,
局部变量在内存中的存储位置就发生了变化
从栈区到静态区,
放在静态区的变量,创建好后,直到程序结束才 释放。
(2)static 修饰全局变量 称为静态全局变量
static修饰 全局变量 时,
会把外部链接属性变成内部链接属性,
这个全局变量只能在自己所在的源文件内部使用。
(3)static 修饰函数 称为静态函数
static修饰 函数 时,
外部链接属性就变成了内部链接属性
使得这个函数只能在自己所在的源文件内部使用,
其他的源文件无法使用
即 限制了作用域。
每天都在学习的路上!
On The Way Of Learning
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/149842.html