首页 > 其他分享 >C语言关键字——static和extern

C语言关键字——static和extern

时间:2024-03-27 22:32:31浏览次数:28  
标签:函数 局部变量 C语言 修饰 static extern 全局变量 变量

大家好,今天和大家分享C语言中的两个关键字以及作⽤域和⽣命周期的有关知识,创作不易,三连支持一下吧!

812dd1a160274e53b45d2b148cd7ba71.gif

c0e3a43d0eb344789b45f8c5ab1fdac5.jpeg

一、作用域和生命周期

在了解static和extern之前,我们先了解一下作用域和生命周期。

1.作用域

作⽤域(scope)是程序设计概念,通常来说,⼀段程序代码中所⽤到的名字并不总是有效(可⽤)的,⽽限定这个名字的可⽤性的代码范围就是这个名字的作⽤域。
局部变量的作⽤域是变量所在的局部范围;
全局变量的作⽤域是整个⼯程(项⽬)。

如:8f08d0db0af24861bc4ad1ec31571eed.png

9e5de85a58c841b988438734bf068d4b.png

那我们又有疑问了,局部变量和全局变量都在怎么办——采用就近原则,就是优先使用该作用域的变量,也就是优先使用局部变量。但不允许同一个作用域定义多个相同的变量名,会产生冲突。

如:

3b6a178c73944267a1f75133600264bc.png

2.生命周期

⽣命周期指的是变量的创建(申请内存)到变量的销毁(收回内存)之间的⼀个时间段。
局部变量的⽣命周期是:进⼊作⽤域变量创建,⽣命周期开始,出作⽤域⽣命周期结束。
全局变量的⽣命周期是:整个程序的⽣命周期。

我也可以理解为变量的存活时间。如:fec40b04a16347d3ba4ffa2f8e11676f.png
d7d8b2c69d1344af9f62bbfb34e54a79.png

作用域和生命周期与函数栈帧的创建与销毁有关,函数栈帧的创建与销毁我们在后面会具体学习。

二、static和extern

static和extern都是C语⾔中的关键字。
static是静态的 的意思,可以⽤来:
• 修饰局部变量
• 修饰全局变量
• 修饰函数
extern是⽤来声明外部符号的。

下面我们就具体学习它们的功能和用法。

1.static修饰局部变量

我们先来看两段代码:

0e6e6fa9329a4c7180fa0839641a7f2b.pnge492cb8493804b5899944044c2d67d07.png

我们可以看得到这两段代码的运行结果不一样,仅仅是因为多了一个static。

代码1的fun函数中的局部变量i是每次进⼊fun函数先创建变量(⽣命周期开始)并赋值为0,然后++,再打印,出函数的时候变量⽣命周期将要结束(释放内存)。
代码2中,我们从输出结果来看,i的值有累加的效果,其实fun函数中的i创建好后,出函数的时候是不会销毁的,重新进⼊函数也就不会重新创建变量,直接上次累积的数值继续计算。

所以我们得出结论:static修饰局部变量改变了变量的⽣命周期,⽣命周期改变的本质是改变了变量的存储类型,本来⼀个局部变量是存储在内存的栈区的,但是被 static 修饰后存储到了静态区。存储在静态区的变量和全局变量是⼀样的,⽣命周期就和程序的⽣命周期⼀样了,只有程序结束,变量才销毁,内存才回收,但是作⽤域不变。
接下来我们画图理解一下:cd1081e708e54235b400749a19b2121c.png

我们知道内存分为栈区,堆区和静态区,一般局部变量和函数参数存放在栈区,而静态变量和全局变量存在静态区,当局部变量前加上static后就变成了静态变量。未来⼀个变量出了函数后,我们还想保留值,等下次进⼊函数继续使⽤,就可以使⽤static修饰。

2.static修饰全局变量

我们还是先来看两段代码:

c0d0b8096c2f4b1587ce9aadc9b3c106.png6eacaef891d24e9db42b6c8185aa6851.png

在这里,extern是⽤来声明外部符号的,如果⼀个全局的符号在A⽂件中定义的,在B⽂件中想使⽤,就可以使⽤ extern 进⾏声明,然后使⽤。

我们可以看到第一段代码可以正常运行,第二段代码报了错。

⼀个全局变量被static修饰,使得这个全局变量只能在本源⽂件内使⽤,不能在其他源⽂件内使⽤。

本质原因是全局变量默认是具有外部链接属性的,在外部的⽂件中想使⽤,只要适当的声明就可以使⽤;但是全局变量被 static 修饰之后,外部链接属性就变成了内部链接属性,只能在⾃⼰所在的源⽂件内部使⽤了,其他源⽂件,即使声明了,也是⽆法正常使⽤的。

所以:如果⼀个全局变量,只想在所在的源⽂件内部使⽤,不想被其他⽂件发现,就可以使⽤
static修饰。

3.static修饰函数

先来看两段代码:

0acf4e97f8c94350b445bb03410c7417.png7aba730f8d1443c888744068b663d761.png

第一段代码是能够正常运⾏的,但是第二段代码就出现了链接错误。

所以我们可得出结论: static 修饰函数和static 修饰全局变量是⼀模⼀样的,⼀个函数在整个⼯程都可以使⽤,被static修饰后,只能在本⽂件内部使⽤,其他⽂件⽆法正常的链接使⽤了。

本质是因为函数默认是具有外部链接属性,具有外部链接属性,使得函数在整个⼯程中只要适当的声明就可以被使⽤。但是被 static 修饰后变成了内部链接属性,使得函数只能在⾃⼰所在源⽂件部使⽤。
所以以后我们想要⼀个函数只想在所在的源⽂件内部使⽤,不想被其他源⽂件使⽤,就可以使⽤ static 修饰。

好了以上就是本文的全部内容了,感谢大家的观看,有错误的话欢迎指正。三连支持一下再走呗

标签:函数,局部变量,C语言,修饰,static,extern,全局变量,变量
From: https://blog.csdn.net/2301_79697817/article/details/137074201

相关文章

  • 用C语言实现简单的五子棋小游戏(附上全代码以及思路讲解)
    目录(全代码在文末哦)  如果要实现五子棋,首先第一步要写一个菜单,让玩家可供选择,比如:输入’1‘,开始游戏,输入’0’,结束游戏。但是你不能只执行一次,所以要写一个dowhile循环,让他至少能循环一次。然后写一个switch语句,让系统来判断玩家选择的什么以此来做出相对应的动作。void......
  • 从零开始学c语言(3)
    常用运算符运算方法&(按位与)  |(按位或)^(按位异或) <<(左移)>>(右移) ~(按位求反) ......
  • C语言学习之第一个C语言程序【建议收藏】
    环境搭建好了C语言学习之环境搭建【建议收藏】-CSDN博客,接下来让我们一起来用VC编写第一个C语言程序吧!保姆级教程,非常建议小白学习使用,建议收藏!第一个C语言程序 双击打开VC,然后点击新建项目:按照图上的步骤,创建新项目→点击确定引导点击下一步:应用程序设置:项目创建完成:外......
  • 数据结构——栈(C语言版)
    前言:在学习完数据结构顺序表和链表之后,其实我们就可以做很多事情了,后面的栈和队列,其实就是对前面的顺序表和链表的灵活运用,今天我们就来学习一下栈的原理和应用。准备工作:本人习惯将文件放在test.c、SeqList.c、SeqList.h三个文件中来实现,其中test.c用来放主函数,SeqList.c......
  • C语言 预处理详解
    目录前言一、预定义符号二、#define定义常量三、#define定义宏四、带有副作用的宏参数五、宏替换的规则六、宏与函数的对比七、#和##7.1#运算符7.2##运算符八、命名约定九、#undef十、命令行定义十一、条件编译十二、头文件的包含12.1头文件被包含的方式:12......
  • 网上的一个用C语言实现FFT算法
     用C语言实现FFT算法/*****************fftprograme*********************/#include"typedef.h"#include"math.h"structcompxEE(structcompxb1,structcompxb2){structcompxb3;b3.real=b1.real*b2.real-b1.imag*b2.imag;b3.imag=b1.real*b2.imag+b1.imag*b2.real;......
  • 宏定义(C语言)
    1、宏定义一个两数相乘#defineMUL(a,b)a*b代码如下:#include<stdio.h>#defineMUL(a,b)a*bintmain(){intvalue;printf("value=%d\n",MUL(2,4));return0;}2、在虚拟机中运行,利用如下命令进行屏蔽屏蔽头文件,就可以完成宏替换。gcc-Edemo.c-o......
  • 0基础 三个月掌握C语言(15)
    动态内存管理为什么要有动态内存分配我们已经掌握的内存开辟⽅式有:intval=20; //在栈空间上开辟四个字节chararr[10]={0};//在栈空间上开辟10个字节的连续空间但上述的开辟空间的⽅式有两个特点:•空间开辟⼤⼩是固定的。•数组在申明的时候,必须指定数组的......
  • C语言-实现文件操作
    0.前言:    我们知道下载东西,电脑上就会有各种的文件夹及文件里面的内容,那么文件里面的数据怎么通过编写程序来帮我们获取呢,这些文件又是怎么创建的呢?C语言给我们提供了一些可以操作文件的函数。这里我只列举了一部分操作文件的函数,使用这些函数需要引入头文件<stdlib.......
  • C语言实现游戏——三子棋
    三子棋是一种民间传统游戏,又叫九宫棋、井字棋等。游戏分为双方对战,双方依次在9宫格棋盘上摆放棋子,率先将自己的三个棋子走成一条线就视为胜利,而对方就算输了,但是三子棋在很多时候会出现和棋的局面。今天我们就来用C语言来实现一下这个游戏游戏分解:本文采用分文件编写的模式,实......