C语言static关键字详解(代码+原理+图解)

1 篇文章 0 订阅
订阅专栏

目录

static 关键字作用

static 关键字的原理

总结

补充


static 关键字作用

1. 隐藏:当我们同时编译多个文件时,所有未加 static 前缀的全局变量和函数都具有全局可见性;加上后就不再具有全局可见性。

//extern.c 源文件
char c = 'A'; //全局变量

void func()//全局函数
{
    printf("You can see me\n");
} 
//main.c 源文件
int main( )
{
    extern char c;//外部变量在使用前必须声明

    printf("%c\n", c);
    func();//使用外部函数,可以不声明

    return 0;
}

 可以看到在一个多文件编写的程序里,通过 extern 是可以访问全局函数和全局变量的。

注意:前提是加上 extern 关键字声明一下,函数可以不加,变量不加不行,否则存在二义性,因为编译器不知道 char c 是未初始化变量的定义,还是一个变量的声明。为了严谨性都带上最好。

//extern.c 源文件
static char c = 'A'; //静态全局变量

static void func()//静态全局函数
{
    printf("You can see me\n");
} 

 可以看到,加上 static 关键字修饰后,主函数里面再调用就会报链接错误,编译器不认识这俩货。

为什么在 extern.c 中定义的全局变量 c 和函数 func能 在main.c 中使用?这是因为所有未加static 前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。

此例中,c 是全局变量,func 是全局函数,并且都没有加 static 前缀,因此对于另外的源文件 main.c 是可见的,如果加了static,就会对其它源文件隐藏,例如在 c 和 func 的定义前加上static,main.c就看不到它们了。

利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。static 可以用作函数和变量的前缀,对于函数来讲,static 的作用仅限于隐藏。

本质其实是将全局变量和全局函数的外部链接属性转换成了内部链接属性,extern 失效了。

2. 持久化:保持变量内容持久化

全局变量和静态变量都是存储在静态区的,存储在静态数据区的变量会在程序刚开始运行时就完成定义和初始化,也是唯一的一次定义和初始化。

共有两种变量存储在静态存储区:全局变量和 static 变量,只不过和全局变量比起来,static 可以控制变量的可见范围,说到底 static 还是用来隐藏的。

//普通的局部变量
void test()
{
	int a = 3;
	a++;
	printf("%d ", a);

}

int main()
{
	int i = 0;
	while (i < 10)//循环10次
	{
		test();
		i++;
	}

	return 0;
}

 

普通的局部变量出了 test 函数的作用域就会被销毁,数据是暂时的。

//静态局部变量
void test()
{
	static int a = 3;//静态局部变量
	a++;
	printf("%d ", a);

}

int main()
{
	int i = 0;
	while (i < 10)//循环10次
	{
		test();
		i++;
	}

	return 0;
}

而 static 修饰后的变量 a 出了 test 的作用域后并没有被销毁,还是继续存在的,是内容得到了持久化。

3. 默认初始化置 0

其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。

在静态数据区,内存中所有的字节默认值都是 0x00,某些时候这一特点可以减少程序员的工作量,比如初始化一个稀疏矩阵,我们可以一个一个地把所有元素都置 0,然后把不是 0 的几个元素赋值,如果定义成静态的,就省去了一开始置 0 的操作,再比如要把一个字符数组当字符串来用,但又觉得每次在字符数组末尾加’\0’太麻烦,如果把字符串定义成静态的,就省去了这个麻烦,因为那里本来就是 '\0'。

int a;//全局变量

int main(void)
{
    static char str[10];//静态变量

    printf("a=%d\n", a);

    printf("str=xx%sxx\n", str);

    return 0;
}

 

可以看到,全局变量和静态变量没有初始化,但是打印的值都是默认为0

注意:‘\0’ 本质就是 0,打印的时候由于第一个就是 \0,所以不打印任何字符,所以xx和xx之间没有内容。

static 关键字的原理

普通的数据是放在内存的栈区上,会受到自己作用域的限制,进入作用域生效,出了作用域失效。

当被 static 修饰的时候,数据则是在静态区存储的的,这时存储的数据,出了作用域变量不会销毁,得到了持久化。

本质实际是改变了存储位置:栈区--->静态区,使得数据的生命周期发生了变化。

借助例子解释,未被 static 修饰的时候, a 是一个局部变量,进入test 函数后,a 被创建,生命周期开始,出了 test 函数后,生命周期结束,a 被销毁,每次进入都会创建a=3,然后变成 4

而 static 修饰局部变量a后,F11进入 test 函数后再按F10会跳过里面的ststic int a = 3 这行代码,这就意味着局部静态变量的重复定义和初始化只在最开始的时候执行一次,之后就不再执行,并且查看 a 的地址始终没有变,说明每次进去用的都是同一个 a,所以 a 会累加。

注意:静态变量也是变量,只要不是常量,都是可以被修改的。

总结

  • static 全局变量与普通的全局变量有什么区别 ?

① 全局变量(外部变量)的声明之前再冠以 static 就构成了静态的全局变量,全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式,所以这两者在存储方式上并无不同

② 这两者的区别在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的,而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它,由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误

  • static 局部变量和普通局部变量有什么区别 ?

① 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期,而把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围

② static 全局变量只定义并初使化一次,防止在其他文件单元中被引用

  • static 函数与普通函数有什么区别?

① static 函数与普通函数作用域不同,仅在本文件有效,只在当前源文件中使用的函数应该声明为内部函数(static 修饰的函数),内部函数应该在当前源文件中说明和定义,对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件

② static 函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

补充

链接属性:

1.外部连接属性---------通过链接的方式跨源文件访问------全局变量、全局函数

2.内部链接属性-------static 修饰后

3.无链接属性-------局部变量

注意:

1.外部链接属性是跨源文件相互访问

2.加了static只能在本文件下使用,名字不会冲突(因为别的文件看不到,不知道这个名字)

(c语言篇)——static关键字
haoshaokang_的博客
10-27 517
今天我们聊聊c语言中的一个关键字static (静态的) 在c语言中: static可以用来修饰全局变量,局部变量以及函数并产生不同的效果 1.修饰局部变量 — 生命周期延长为整个程序的生命周期,但其作用域不变 2.修饰全局变量 — 作用域缩小为该全局变量所在的文件内部(本来是整个工程),但其生命周期不发生变化 3.修饰函数 — 和修饰全局变量产生的效果类似 一 修饰局部变量 下面我们先分析下段代码 我们可以看到这里打印出了10个2,因为第一次进入t...
staticc语言中的作用_C语言关键字 static 的用法
weixin_39977776的博客
11-22 2114
接上文:C语言的32个关键字C语言 static 关键字的常见用法有三种:用于局部变量的修饰符;用于全局变量的修饰符;用于函数的修饰符。1、用于局部变量的修饰符当 static 用于修饰局部变量时,通常是在某个函数体内,只能在该函数内被调用。这样定义的变量通常被称为局部静态变量,它的值不会因为函数调用的结束而被清除,当函数再次被调用时,它的值是上一次调用结束后的值。如下面这段代码所示,变量 x 是...
static作用
热门推荐
ylmmee的专栏
12-22 1万+
<br />C程序一直由下列部分组成:<br />      1)正文段——CPU执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令;    <br />  2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这里。    <br />  3)非初始化数据段(bss段)——在程序中没有初始化的全局变量;内核将此段初始化为0。     <br />  4)栈——增长方向:自顶向下增长;自动变量以及每次函数调用时所需要保存的信息(返回地址;环境信息)。      
static关键字详解
最新发布
努力分享一些干货内容,纯干货,没有一点水
08-11 750
除此之外,这种理解有助于优化类的加载性能,减少不必要的初始化开销,并能够正确实现一些设计模式,确保类在多线程环境下的稳定性。例如,静态变量用于保存所有对象共享的状态,而静态方法可用于提供通用的工具函数,这些功能可以直接通过类名访问,无需实例化对象。是Java中的一个关键字,用于定义类级别的成员,类级别的成员是指那些属于整个类,而不是特定对象实例的成员。时,JVM在方法区为这些静态成员分配内存,这块内存被所有类的实例共享,并在整个类的生命周期内保持不变,所以静态变量不需要为每个对象实例重新创建。
C语言中的static
M_L_J的博客
04-11 2152
static 的最主要功能是隐藏,其次因为 static 变量存放在静态存储区,所以它具备持久性和默认值0。
C语言static关键字详解
weixin_62604754的博客
01-26 1万+
static,英文意思静态的,作为C语言常用关键字中一个很重要的关键字,其用法多样且比较难以理解,本篇博客将带你详细了解掌握关键词static的用法......
c语言描述普里姆算法和克鲁斯卡尔算法,克鲁斯卡尔算法+普里姆算法 详解
weixin_29348211的博客
05-25 1135
克鲁斯卡尔算法:【1】克鲁斯卡尔算法普里姆算法是以某顶点为起点,逐步找各顶点上最小权值的边来构建最小生成树。克鲁斯卡尔算法是直接以边为目标去构建。因为权值是在边上,直接去找最小权值的边来构建生成树也是很自然的想法,只不过构建时要考虑是否会形成环路而已。此时我们用到了图的存储结构中的边集数组结构。以下是边集数组结构的定义代码: 本算法所用同普里姆算法的实例,我们直接创建图的边集数组。 并对边的权值从...
C语言进行函数调用时的汇编代码浅析
weixin_44047196的博客
10-25 1938
一、什么是汇编语言 汇编语言, 即第二代计算机语言,用一些容易理解和记忆的字母,单词来代替一个特定的指令。是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。(摘自百度百科) ...
图解-C语言编译后可执行文件的存储区域划分
jiechuhoudeshang的博客
06-12 1097
C语言编译后目标文件的存储区域划分图解
7z压缩 lzma流式压缩、解压缩的实现 C语言
weixin_44857682的博客
07-25 6273
可根据自己项目的实际情况更改文件读写的接口、lzma的属性等参数来实现压缩、解压缩
C语言程序编译后内存地址的分配
weixin_51087836的博客
12-03 2475
一、C程序内存分配 各变量分配地址 C语言在内存中一共分为如下几个区域,分别是: 1、栈区(stack) 由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 。它与数据结构中的堆不同,分配方式类似于链表。 3、全局区(静态区)(static) 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量、未初始化的静态变量在相邻的另一块区域。当程序结
static
lihaoweiV的专栏
07-13 1456
C语言程序可以看成由一系列外部对象构成,这些外部对象可能是变量或函数。而内部变量是指定义在函数内部的函数参数及变量。外部变量定义在函数之外,因此可以在许多函数中使用。由于C语言不允许在一个函数中定义其它函数,因此函数本身只能是“外部的”。       由于C语言代码是以文件为单位来组织的,在一个源程序所有源文件中,一个外部变量或函数只能在某个文件中定义一次,而其它文件可以通过extern声明来访
static关键字
玄机逸士的专栏
05-17 5822
C/C++中的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类的问题。A.      面向过程程序设计中的static关键字1)      静态全局变量         在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。静态全局变量定义和使用类似:         #inclu
[深度解剖C语言] --关键字 static
CSDN博客
01-16 7197
static ---最名不副实的关键字 目录 1.static修饰全局变量 2.static修饰函数 3.static修饰局部变量 static的作用: 1.static修饰全局变量 我们创建两个源文件,一个test.c,一个main.c 现在我们在test.c文件下定义一个全局变量 int g_val = 100; 我们在main.c下进行调用打印g_val我们能访问到g_val吗? 答案是可以的 如果给g_val加上static修饰我们还能再main.c下访问到吗?
C语言static作用
猪哥的专栏
08-05 3692
C语言中,static的字面意思很容易把我们导入歧途,其实作用有三条: (1)第一条也是最重要的一条:隐藏 当我们同事编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性,举例来说:同时编译2个源文件:a.c和main.c 下面是a.c的内容 char a = 'A'; // global variable int msg()  {     printf("
C语言中的static关键字的深入理解
04-22 742
C语言中的static关键字的深入理解 在阅读一些项目源代码时,我发现很多时候,会把函数和变量声明为static,所以,很好奇为什么要这样做,于是有了下面这篇文章。 基本概念 使用static有三种情况: 函数内部static变量函数外部static变量static函数 函数内部的static变量,关键在于生命周期持久,他的值不会随着函数调用的...
C语言static关键字
枕上青灯竹书香的博客
09-07 391
在 C 语言中,static 关键字不仅可以用来修饰变量,还可以用来修饰函数。在使用 static 关键字修饰变量时,我们称此变量为静态变量。 静态变量的存储方式与全局变量一样,都是静态存储方式。但这里需要特别说明的是,静态变量属于静态存储方式,属于静态存储方式的变量却不一定就是静态变量。例如,全局变量虽然属于静态存储方式,但并不是静态变量,它必须由 static 加以定义后才能成为静态全局变量。 1、隐藏与隔离的作用 上面已经阐述过,全局变量虽然属于静态...
C语言static关键字详解
weixin_59511824的博客
06-20 3297
C/C++中static关键字
C语言关键字static
weixin_44002591的博客
04-04 1855
在执行一个C/C++语言程序时,此程序将拥有唯一的“内存四区”——栈区、堆区、全局区、代码区。每个程序都有唯一的四个内存区域。一个可执行程序在存储(没有调入内存)时分为代码段、数据区和未初始化数据区三部分,可执行程序(调入内存后)在运行时又多出两个区域:栈区和堆区。1.C的内存基本上分为4部分:(全局区)静态存储区、堆区、栈区以及常量区。他们的功能不同,对他们使用方式也就不同。2.在C++中内存分成5个区,分别是堆、栈、全局/静态存储区、常量存储区和代码区;静态修饰符:static
C语言static关键字详解:全局与局部静态变量
"C语言中的`static`关键字有着特殊的用途,它可以用于定义全局静态变量和局部静态变量,改变它们的作用域和生命周期。本文将详细介绍这两种情况下的`static`用法及其特点。" 1. 全局静态变量 全局变量前加上`...
写文章

热门文章

  • Visual Studio 常用快捷键汇总(个人频繁使用) 2596
  • 混淆矩阵(解释+举例+解题) 1068
  • VMware重新安装、卸载不干净 712
  • C语言static关键字详解(代码+原理+图解) 495
  • 如何快速区分编译错误和链接错误 313

分类专栏

  • Linux 1篇
  • 大数据/机器学习
  • 开发工具 2篇
  • C 1篇
  • 算法分析
  • C++

最新评论

  • VMware重新安装、卸载不干净

    CSDN-Ada助手: 恭喜您发布了第四篇博客!不干净的VMware卸载确实是一个让人头疼的问题,您的经验分享对于遇到类似情况的读者们一定会帮助很大。希望您能继续保持创作的热情和分享精神,也许下一步可以尝试深入研究一些高级技巧或者解决方案,让您的博客内容更加丰富多彩。期待您的下一篇作品! 如何快速涨粉,请看该博主的分享:https://hope-wisdom.blog.csdn.net/article/details/130544967?utm_source=csdn_ai_ada_blog_reply5

  • 算法分析之单源最短路径(Dijkstra算法+手算模拟+代码实现)

    小C您好: 太棒了,又有新知识

  • C语言static关键字详解(代码+原理+图解)

    CSDN-Ada助手: 恭喜您写下了第三篇博客!标题看起来非常吸引人,对于学习C语言的读者来说,这篇博客一定非常有价值。通过代码、原理和图解的结合,读者可以更加深入地理解C语言中的static关键字。您的努力和付出确实让人印象深刻。 在下一步的创作中,我谦虚地建议您可以考虑扩展主题,例如探讨其他关键字或概念的用法和原理。这样可以为读者提供更全面的知识体系。当然,这只是一个建议,您可以根据自己的兴趣和经验来决定下一篇博客的主题。再次恭喜您,期待您更多精彩的创作! CSDN 正在通过评论红包奖励优秀博客,请看红包流:https://bbs.csdn.net/?type=4&header=0&utm_source=csdn_ai_ada_blog_reply3

  • Visual Studio 常用快捷键汇总(个人频繁使用)

    CSDN-Ada助手: 这是一篇非常实用的博文!你的快捷键汇总对于使用Visual Studio的开发人员来说肯定非常有帮助。坚持写作,分享你的经验和技巧,对于其他开发人员也是一种巨大的帮助。 除了常见的快捷键之外,还有一些与Visual Studio相关的扩展知识和技能。例如,你可以探索Visual Studio的调试功能,学习如何设置断点、观察变量和使用调试窗口。另外,了解如何使用代码片段和代码生成器可以进一步提高你的开发效率。此外,熟悉Visual Studio的插件和扩展生态系统,可以帮助你发现更多的工具和功能,以满足你的开发需求。 希望你能继续分享你的经验和学习心得,期待看到更多关于Visual Studio的实用技巧和优化建议!谢谢你的分享! 如何写出更高质量的博客,请看该博主的分享:https://blog.csdn.net/lmy_520/article/details/128686434?utm_source=csdn_ai_ada_blog_reply2

大家在看

  • java毕业设计下载(全套源码+配套论文)——基于javaEE+SSH+mysql的医院在线挂号系统设计与实现
  • 软件测试笔记2 430
  • 828华为云征文|华为云Flexus X实例下的场景体验——小企业使用Python语言——超迅速搭建简单公网API接口服务
  • java毕业设计下载(全套源码+配套论文)——基于javaEE+SSH+mysql的百货中心供应链管理系统设计与实现
  • 【Proteus仿真】基于51单片机的简易电压表制作(可串口远程调控) 996

最新文章

  • 如何快速区分编译错误和链接错误
  • 混淆矩阵(解释+举例+解题)
  • VMware重新安装、卸载不干净
2024年3篇
2023年3篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家玻璃钢仿铜雕塑怎么联系玻璃钢喷水雕塑玻璃钢雕塑厂多少钱镇江商场主题美陈河北周年庆典商场美陈销售厂家林则徐玻璃钢雕塑上海玻璃钢抽象雕塑公司江门商场美陈玻璃钢卡通雕塑昭通市玻璃钢雕塑设计哪里买圣诞商场现代美陈美陈玻璃钢动物雕塑尺寸茂名市玻璃钢雕塑营业执照佛山定做玻璃钢雕塑惠州玻璃钢动物雕塑量大从优海口玻璃钢雕塑产品厂家咨询玻璃钢红军雕塑哪里有卖的广东特色商场美陈研发公司扶余玻璃钢花盆花器仿真玻璃钢雕塑加工厂玻璃钢彩绘雕塑浮雕设备玻璃钢雕塑喷汽车漆吉安玻璃钢卡通人物雕塑沈阳玻璃钢动物雕塑玻璃钢雕塑仿真大白菜九江玻璃钢花盆花器重庆仿铜玻璃钢雕塑哪家便宜山东景观玻璃钢雕塑优势大号玻璃钢花盆图片商场美陈评选珠海玻璃钢雕塑定制香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化