【C语言】static关键字详解

这篇具有很好参考价值的文章主要介绍了【C语言】static关键字详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.static关键字是什么?

2.static关键字修饰的对象是?

3.static修饰后改变了什么?

4.static修饰操作演示

(1) 局部变量

如果加了static修饰局部变量i会怎么样?

全局区(静态区)

(2) 全局变量

如果给全局变量加上了static修饰呢?

二者区别? 

这样用有什么用?

(3) 函数

5.总结

static修饰局部变量

static修饰全局变量

static修饰函数

6.补充 

后言 


1.static关键字是什么?

· static关键字在c语言中还是比较常用的,使用恰当能够大大提高程序的模块化特性,有利于扩展和维护。但是对于c语言初学者,static由于使用灵活,并不容易掌握。

本文就static在c语言中的应用进行总结,供参考使用。 

本文会提及C/C++中的内存分区,内存讲解也是点到为止。对此不了解的小伙伴的可以百度一下,后面会出一期内存分区详解。


2.static关键字修饰的对象是?

1.局部变量

2.全局变量

3.函数


3.static修饰后改变了什么?

1.改变了生存周期:就是一个变量、函数从分配内存到回收内存的过程
2.改变了作用域:就是可以在哪些文件里可以使用该函数或者变量


4.static修饰操作演示


(1) 局部变量

void test()
{
	int i = 1;
	i++;
	printf("%d ", i);    
}
int main() {
	int j = 0;
	while (j < 5)
	{
		test();
		j++;
	}
	return 0;
}

通过上面的代码可以看出,test函数会被调用5次。

因为局部变量是存放在“栈区(stack)”,栈区内存的特点是:由编译器自动分配、释放。

所以test中局部变量 i 在每次进入这个函数时都要被创建一次,然后i++,最后输出,当前test函数结束,局部变量 i 内存被释放。

由此可见,每次进入test都是一个全新的局部变量 i,结果如下。

【C语言】static关键字详解

 如果加了static修饰局部变量i会怎么样?

【C语言】static关键字详解

 我们可以发现 i 的值经过多次test函数的调用,没有销毁。这说明了用了static关键词修饰的局部变量 i 的生命周期被延长了。这也说明了静态局部变量 i 肯定和局部变量的 i 的存放位置不一样。接下来,就讲的是“全局区”。

全局区(静态区)

static关键字修饰的局部变量 i 是存放在“全局区”,全局区内存的特点是:在整个程序结束后,由操作系统自动释放。不同于普通的局部变量i,生命周期只在test函数结束就消亡了。static修饰下的i是要整个程序结束才释放。

【C语言】static关键字详解

因此,以 i 为例子,栈区和全局区在本代码可视化为上图。(不严谨,本图仅供参考)

相信上面的例子,应该可以对你建立基本的了解。

【C语言】static关键字详解

【C语言】static关键字详解

以上为汇编代码,可以看到,普通变量 i 是回通过编译成汇编转二进制的。而静态变量不会


(2) 全局变量

 【C语言】static关键字详解

 上面代码是在同一个项目下的两个.c 文件,在左边.c文件声明了一个普通的全局变量,用extern来声明外部符号来声明g_val的存在,是可以正常访问的。如下图

【C语言】static关键字详解

 如果给全局变量加上了static修饰呢?

 【C语言】static关键字详解

 可以看到“无法解析的外部符号 _g_val”,这说明了静态全局变量只能在当前.c文件中访问。


二者区别? 

·普通全局变量对整个工程可见,其他文件可以使用extern外部声明后直接使用。也就是说其他文件不能再定义一个与其相同名字的变量了(否则编译器会认为它们是同一个变量)。

·静态全局变量仅对当前文件可见,其他文件不可访问其他文件可以定义与其同名的变量,两者互不影响。


这样用有什么用?

 在定义不需要与其他文件共享的全局变量时,加上static关键字能够有效地降低程序模块之间的耦合,避免不同文件同名变量的冲突,且不会误使用。


(3) 函数

【C语言】static关键字详解

函数和全局变量的情况其实基本一致,所以简单讲一下吧。

同样是外部定义普通的swap函数,用extern声明外部函数(当然也可以用头文件的方式),可见可以正常访问。

【C语言】static关键字详解

 但用了static修饰后,也只能在本.c文件中使用了。外部不可访问。


5.总结

static修饰局部变量

应用:在函数内,我们想保留某些变量上一次的值,就可以用static去修饰该变量。比如:想统计该函数被执行的次数时,就可以定义被static修饰的int型变量,每执行一次该变量就++。

总结:用static修饰的局部变量,改变了生存周期,但是没有改变其作用域。改变其生存周期的原因是被static修饰的局部变量被存放在.bss段(未初始化)或者 .data段(初始化),但两者都是在(全局区)静态区,而普通的局部变量是存放在栈上的。

static修饰全局变量

应用:当一个全局变量不想被其他.c文件引用时,可以用static修饰,这样其他的文件就不能通过extern的方式去访问,这样主要是为了数据安全
总结:改变其作用域,没有改变生存周期

 static修饰函数

应用:有些函数并不想对外提供,只需要在本文件里调用,这时候就可以用static去修饰。
总结:改变了作用域,没有改变其生存周期


6.补充 

用static修饰全局变量和函数,除了上面说的数据安全防止被误引用

还有一个作用是解决重名问题。当用static修饰了全局变量和函数后,其他文件里再定义同名的全局变量和函数也是可以的。

一般来说,如果不是要对外提供的函数和全局变量,最好都用static修饰。

后言 

本篇基本介绍了C语言中static关键字的概念,基本应用场景,应用实例,和总结。相信可以给初学着在理解和使用上有一定的帮助。本篇有着内存分区,生命周期和作用域方面的知识。后面会出单篇详解,希望大家支持。因个人能力有限,如果有错误的地方,请大家指出。文章来源地址https://www.toymoban.com/news/detail-499520.html

到了这里,关于【C语言】static关键字详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++—static关键字详解

    C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。 静态全局变量有以下特点: 1、该变量在全局数据区分配内存; 2、未经初始化的静态全局变量会被程序自动初始化为

    2024年02月15日
    浏览(26)
  • 详解const、static关键字

    目录   一、static 二、const 在c语言中: static是用来修饰变量和函数的         1.修饰局部变量——称为静态局部变量         2.修饰全局变量——称为静态全局变量         3.修饰函数——称为静态函数 有关内存相关知识补充: 程序的所有数据,也就是所有的

    2024年02月06日
    浏览(36)
  • 详解Java的static关键字

    不依赖于对象实例:静态方法不需要依赖于任何对象实例,因为它们与具体的对象实例无关联。这意味着在没有创建对象实例的情况下,就可以直接通过类名访问或调用静态方法。 可以访问静态成员:静态方法可以访问类的静态成员(静态字段和静态方法),但不能访问非静

    2024年02月05日
    浏览(39)
  • [开发语言][c++]:Static关键字和全局变量

    写在前面: 如果您只是想回顾或了解一下static和全局变量的异同点,那么下面的总结将满足您的需求。 如果您是一位初学者或对二者的使用模棱两可,建议您读完该篇文章,相信这一篇将解答完您对于static以及全局变量的所有疑惑。 如有问题或建议欢迎评论 or 私信

    2024年01月20日
    浏览(42)
  • 在 C/C++中 static 关键字详解

    static 是 C/C++中的 之一, 是常见的函数与变量(C++中还包括类)的修饰符 ,它常被用来控制变量的存储方式和作用范围。 在众多高级语言中都有其作为或函数出现,所以这也是应当被程序员熟知其各种含义的一个单词 我们知道在函数内部定义的变量,当程序执

    2024年02月14日
    浏览(26)
  • 嵌入式C语言关键字(const、static、volitatile)

    C语言中const修饰通常是用来声明常量,并声明常量的值不能修改。当涉及 指针变量 时情况就会变得更加有趣,需要特别注意。因为有两样东西都有可能成为常量— 一种是用来限定指向的空间的值不可修改;另一种是限定指针不可修改 。下面是几个声明的例子: 总结:cons

    2024年02月06日
    浏览(30)
  • 【文末福利】C语言扫盲——关键字static究竟限制了谁?

    【知识科普】C语言的static究竟限制了谁? 这是一个有趣的话题,虽然说教科书给了你一些说法,但你真正能把static说清楚吗?本文将通过一个案例,给大家做一个深度的拆解分析。 注:在本文的讨论中,无明确说明时,指的都是static修饰函数,而非变量。 最近的几个月一直

    2024年02月14日
    浏览(24)
  • C/C++ static关键字详解(最全解析,static是什么,static如何使用,static的常考面试题)

    目录 一、前言  二、static是什么? 三、static修饰的对象是什么?   四、C 语言中的 static  🍎static的C用法  🍉static的重点概念  🍐static修饰局部变量  💦static在修饰局部变量和函数的作用  🍓static修饰全局变量和函数 💦static在修饰全局变量和函数的作用

    2024年02月05日
    浏览(34)
  • 【让你从0到1学会C语言】指针/数组传参以及static关键字

    作者:喜欢猫咪的的程序员 专栏:《C语言》 喜欢的话:世间因为少年的挺身而出,而更加瑰丽。                                  ——《人民日报》 如果对 指针了解不多的话,请先看我的另外一篇博客: http://t.csdn.cn/0rd9D http://t.csdn.cn/0rd9D 二维数组传参: arr为二维数

    2024年02月16日
    浏览(30)
  • C语言中volatile/register/const/static/extern/auto关键字的作用

    目录 一、volatile 二、register详解 三、const详解 四、static详解 五、extern详解 语法 作用 六、auto详解 突然想总结一下这些的作用,灵活使用这些对程序的可靠性和速率都有提高 volatile是防止编译器优化,如果是高频繁的变量编译器会自动将变量放到寄存器中,但是有的变

    2024年02月07日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包