600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > static--修饰(局部变量 全局变量 函数)

static--修饰(局部变量 全局变量 函数)

时间:2021-10-01 16:50:47

相关推荐

static--修饰(局部变量 全局变量 函数)

文章转载链接:/Payshent/article/details/70242965

在我们刚开始接触接触C语言的时候一定听说过static关键字,在刚开始学习C语言的时候相信很多人都会对static感到记忆深刻,刚开始学的时候我也一脸懵逼,现在觉得时候做一个归纳整理了。static的用法也就下面几点,

1):static修饰局部变量

2):static修饰全局变量

3):static修饰函数

一、static修饰局部变量

普通的局部变量是在栈上进行分配的,局部变量所处的函数被多次调用时每次调用的位置都不一样的。局部变量也可以在堆上进行动态的分配,但须记得释放空间。

静态局部变量和普通局部变量区别如下:

访问权限:静态局部变量只能被其作用域内的变量和函数进行访问使用,它虽然存在与程序的整个生命周期,但由于是static的所以不能被其他函数和源文件访问。

作用位置:静态局部变量被编译器存放在全局存储区(data),所以它虽然是局部的但是却存在与整个生命周期。

值:静态的局部变量如果没有被初始化,会自动被编译器赋值为0,以后每次调用静态局部变量就都会用上次调用的值(每次函数调用静态局部变量都修改它然后离开,下次读的时候从全局存储区读的静态局部变量就是上次修改后的值)。

注意:

由于函数的每次调用,普通的局部变量都会重新分配,而静态局部变量会保持上次调用的值不变。正是由于static局部变量的这种特性,使得静态局部变量的函数变得不可重入,即每次调用可能会产生不同的结果,这在多线程编程时可能会成为一种隐患。

二、static修饰全局变量

说到静态局部变量我们先来看看一个进程在内存中的布局:

.text段(文本段)保存的是进程所执行的二进制文件,.data段(数据段)保存进程已经初始化的全局变量,.bss段保存进程未初始化的全局变量。在进程的整个生命周期中,.data段和.bss段内的数据是根整个进程同生共死的,也就是在进程结束之后这些数据才会寿终正寝。当一个进程的全局变量被声明为static之后,静态全局变量和其他全局变量在存储位置并没有区别,都是在.data段(已初始化)和.bss段(未初始化区),但它只在定义它的源文件内是有效的,在同一 程序的其他源文件内是不可见的,这就是静态全局变量和普通全局变量的区别。

对static修饰的局部变量和全局变量还有疑问的话,可参照我的另一篇博客将静态局部变量,静态全局变量、局部变量、全局变量做的有详细的说明:

局部变量、全局变量、静态局部变量、静态全局变量

(点击可查看)。

三、static修饰函数

当一个程序中有很多源文件的时候,每个源文件可能会提供一些外界需要的接口,其他的函数可能是为了实现这些接口而编写的,这些函数可能不希望被外界所看见就用static来修饰这个函数,这就是静态函数。静态函数有些类似与C++里面private函数。

static函数可以很好的解决不同原文件中函数同名的问题,因为一个源文件中的static函数对其他文件来说是不可见的。

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

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。