C语言中 static (静态的) 关键字详解

C语言中 static (静态的) 关键字详解C 语言中 static 静态的 关键字详解 static 存放在堆区还是栈区

大家好,欢迎来到IT知识分享网。


C语言中 static (静态的) 关键字详解

放在最前面的

🎈 🎈 我的CSDN主页:OTWOL的主页,欢迎!!!👋🏼👋🏼
🎉🎉我的C语言初阶合集:C语言初阶合集,希望能帮到你!!!😍 😍
👋🏼🎉🎊创作不易,欢迎大家留言、点赞加收藏!!! 🥳😁😍

1、前言

1、static是用来修饰变量函数
2、变量有局部变量、全局变量之分

2、补充计算机的内存分布

(1)主要分为三个区

⼀般我们在学习C/C++语⾔的时候,
我们会关注 内存中的三个区域:
1、栈区、
2、堆区、
3、静态区


1.局部变量是放在内存的 栈区
2. 全局变量是放在内存的 静态区
3. 堆区是⽤来 动态内存管理

(2)内存分布的图片展示
图片1

C语言中 static (静态的) 关键字详解

图片2

C语言中 static (静态的) 关键字详解

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; } 
  • 输出结果C语言中 static (静态的) 关键字详解
  • 原因:

普通的局部变量是放在栈区 上的, 这种局部变量进入作用域创建,出了作用域就释放;

即每次进入 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; } 
  • 输出结果C语言中 static (静态的) 关键字详解
  • 原因:

但是局部变量被 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;

  • 输出结果
    C语言中 static (静态的) 关键字详解

(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;

  • 输出结果 报错!C语言中 static (静态的) 关键字详解
  • 原因:

全局变量本身是具有外部链接属性的,
在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);

  • 输出结果C语言中 static (静态的) 关键字详解
(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);

  • 输出结果 报错!C语言中 static (静态的) 关键字详解
  • 原因:

函数本身是具有外部链接属性的 被 static 修饰后,
外部链接属性就变成了内部链接属性
使得这个函数只能在自己所在的源文件内部使用
其他的源文件无法使用 即限制了作用域。

4、总结

(1)static 修饰局部变量 称为静态局部变量

static修饰 局部变量 时,
局部变量在内存中的存储位置就发生了变化
栈区静态区
放在静态区的变量,创建好后,直到程序结束释放

(2)static 修饰全局变量 称为静态全局变量

static修饰 全局变量 时,
会把外部链接属性变成内部链接属性,
这个全局变量只能在自己所在的源文件内部使用

(3)static 修饰函数 称为静态函数

static修饰 函数 时,
外部链接属性就变成了内部链接属性
使得这个函数只能在自己所在的源文件内部使用,
其他的源文件无法使用
即 限制了作用域。


每天都在学习的路上!
On The Way Of Learning
C语言中 static (静态的) 关键字详解

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/149842.html

(0)
上一篇 2025-03-21 22:25
下一篇 2025-03-21 22:26

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信