c语言中,c语言静态变量定义作用范围是整个程序吗

C语言中static的作用及C语言中使用静态函数有何好处
字体:[ ] 类型:转载 时间:
在C语言中,static的作用有三条:一是隐藏功能,二是保持持久性功能,三是默认初始化为0。本文重点给大家介绍C语言中static的作用及c语言中使用静态函数有何好处,对本文感兴趣的朋友一起看看吧
想了解Ja介绍,处了解详情。
在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条,分别是:
一是隐藏功能,对于static修饰的函数和全局变量而言
二是保持持久性功能,对于static修饰的局部变量而言。
三是因为存放在静态区,全局和局部的static修饰的变量,都默认初始化为0
下面我逐一给大家介绍:
(1)先来介绍它的第一条也是最重要的一条:隐藏。
当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。
下面是a.c的内容
char a = 'A'; // global variable
void msg()
printf("Hello\n");
下面是main.c的内容
int main(void)
// extern variable must be declared before use
printf("%c ", a);
(void)msg();
程序的运行结果是:
你可能会问:为什么在a.c中定义的全局变量a和函数msg能在main.c中使用?前面说过,所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。此例中,a是全局变量,msg是函数,并且都没有加static前缀,因此对于另外的源文件main.c是可见的。
如果加了static,就会对其它源文件隐藏。例如在a和msg的定义前加上static,main.c就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。Static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏,而对于变量,static还有下面两个作用。
(2)static的第二个作用是保持变量内容的持久。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。虽然这种用法不常见,但我还是举一个例子。
#include &stdio.h&
int fun(void){
static int count = 10; // 事实上此赋值语句从来没有执行过
return count--;
int count = 1;
int main(void)
printf("global\t\tlocal static\n");
for(; count &= 10; ++count)
printf("%d\t\t%d\n", count, fun());
&程序的运行结果是:
global&&&&&&&&& local static
1&&&&&&&&&&&&&& 10
2&&&&&&&&&&&&&& 9
3&&&&&&&&&&&&&& 8
4&&&&&&&&&&&&&& 7
5&&&&&&&&&&&&&& 6
6&&&&&&&&&&&&&& 5
7&&&&&&&&&&&&&& 4
8&&&&&&&&&&&&&& 3
9&&&&&&&&&&&&&& 2
10&&&&&&&&&&&&& 1
(3)static的第三个作用是默认初始化为0。其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。比如初始化一个稀疏矩阵,我们可以一个一个地把所有元素都置0,然后把不是0的几个元素赋值。如果定义成静态的,就省去了一开始置0的操作。再比如要把一个字符数组当字符串来用,但又觉得每次在字符数组末尾加'\0'太麻烦。如果把字符串定义成静态的,就省去了这个麻烦,因为那里本来就是'\0'。不妨做个小实验验证一下。
#include &stdio.h&
int main(void)
static char str[10];
printf("integer: %d; string: (begin)%s(end)", a, str);
程序的运行结果如下
integer: 0; string: (begin)(end)
最后对static的三条作用做一句话总结。首先static的最主要功能是隐藏,其次因为static变量存放在静态存储区,所以它具备持久性和默认值0。
以上内容是关于c语言中static的作用。
下面给大家介绍C语言中使用静态函数的好处。
&C语言中使用静态函数的好处:
静态函数会被自动分配在一个一直使用的存储区,直到退出应用程序实例,避免了调用函数时压栈出栈,速度快很多。
关键字“static”,译成中文就是“静态的”,所以内部函数又称静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件。 使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为同名也没有关系。
c语言中static的语义1.static变量:1).局部a.静态局部变量在函数内定义,生存期为整个源程序,但作用域与自动变量相同,只能在定义该变量的函数内使用。退出该函数后, 尽管该变量还继续存在,但不能使用它。b.对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。2).全局全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。但是他们的作用域,非静态全局 变量的作用域是整个源程序(多个源文件可以共同使用); 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。2.static函数(也叫内部函数)只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用。区别于一般的非静态函数(外部函数) static在c里面可以用来修饰变量,也可以用来修饰函数。 先看用来修饰变量的时候。变量在c里面可分为存在全局数据区、栈和堆里。其实我们平时所说的堆栈是栈而不包含对,不要弄混。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具C语言(18)
数据在内存中的存放共分为以下6种形式:
程序代码区——存放程序编译后的可执行代码。全局区(静态区)——全局变量和静态变量的存储是放在一块的,初始化的全局变量和初始化的静态变量在同一区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。常量区——常量就是放在这里的,程序结束后由系统释放。堆区——一般由程序员分配或释放,若程序员不释放,程序结束时可能由操作系统回收(程序不正常结束则回收不了)。栈区——由编译器自动分配并且释放,该区域一般存放函数的参数、局部变量等。寄存器区——内存阶层中的最顶端,一个有限容量的高速存储区,直接建立在中央处理器内部,用来暂存指令、数据和地址,一般用来保存栈顶指针、指令指针和现在正在被运行的指令。由于寄存器区其实是在中央处理器内部建立,而不是在内存中,因此严格上讲,不能将其划分到内存中,只是由于它与内存的功能大致相同,都用来暂存数据,所以将它划分到这里
1、全局变量
定义:在所有函数外部定义的变量称为全局变量(包括main函数),它不属于哪一个函数,而是属于源程序。
说明:全局变量可以为程序中的所有函数所共用,它的有效范围从定义处开始到源程序结束。全局变量的“生命”很长,它在程序的整个执行过程中都占用内存,该变量的“寿命”方才结束。
内存:全局变量保存在全局区(静态区),并始终驻留在全局区,直到程序运行结束。
作用域:作用域为源程序,也就是在整个程序中有效。如果一个源程序由多个源文件组成时,全局变量在各个源文件中都是有效的,也就是多个源文件可以共享。
注意:全局变量如果没有初始值,则由编译器自动初始化为0。
2、静态全局变量
定义:在全局变量前面加上static关键字,这样的变量叫做静态全局变量。
说明:静态全局变量可以为程序中的所有函数所共用,它的有效范围从定义处开始到源程序结束。静态全局变量的“生命”很长,它在程序的整个执行过程中都占用内存,该变量的“寿命”方才结束。
内存:静态全局变量保存在全局区(静态区),并始终驻留在全局区,直到程序运行结束。
作用域:作用域为当前的源文件,即只在定义该变量的源文件内有效,在其他源文件中不能使用,即多个源文件不能共享。
注意:静态全局变量如果没有初始值,则由编译器自动初始化为0。
3、局部变量
定义:局部变量就是在函数内部声明的变量,它只在函数内有效。
说明:只能在本函数内使用它,在本函数外是不能使用它。另外,局部变量的”生命“很短,只有当它所在的函数被调用时,局部变量才有”生命“,而当函数调用结束时,局部变量的”寿命“也随之结束。在函数中定义的局部变量来说,它的有效访问范围通常是从它的定义点开始,到函数的右大括号结束。
内存:局部变量保存在栈中。
作用域:作用域为定义的函数内部,即只在定义的函数内部有效。
注意:局部变量如果没有初始值,则由编译器随机初始化一个数值。
4、静态局部变量
定义:在局部变量前面加上static关键字,这样的变量叫做静态局部变量。
说明:只能在本函数内使用它,在本函数外是不能使用它。在函数中定义的静态局部变量来说,它的有效访问范围通常是从它的定义点开始,到函数的右大括号结束。退出该函数后,尽管该变量还继续存在,但不能使用。
内存:静态局部变量保存在全局区(静态区),并始终驻留在全局区,直到程序运行结束。
作用域:作用域为定义的函数内部,即只在定义的函数内部有效。
注意:静态局部变量如果没有初始值,则由编译器自动初始化为0。
// 内部函数,只在所在的文件有效(团队开发)
static void test3()
printf(&hello world\n&);
// 外部函数,函数在别的文件,所以只需声明即可(团队开发)
extern void test5();
// 外部变量,变量在别的文件,所以只需声明即可(团队开发)
// 自动变量,平时写int,编译器自动加上auto
void test7()
auto int z = 90;
printf(&z:%d\n&,z);
// 寄存器变量,寄存器变量不存在内存中,所以不能使用&来获取它的地址
void test8()
register int i ,sum = 0;
for (i = 1; i &= 100; i ++)
sum =sum+i;
printf(&sum:%d\n&,sum);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:45551次
积分:2906
积分:2906
排名:第8426名
原创:257篇C语言中的变量详解
11:30:01&&&来源:51hei &&
先说说变量的作用域,比如,在函数中,形参变量只是在被调用期间才分配内存单元,调用结束立即释放。这就说明形参变量只有在函授内才是有效的,离开该函数就不能再使用了。
这种变量有效性的范围称为变量的作用域。当然不仅仅是形参变量,在C中所有的量都有自己的作用域。
C中的变量,按作用域可分为两种,局部变量和全局变量。
局部变量:
也称内部变量。局部变量是在函数内做定义说明的,其作用域仅限于函数内部,离开函数后再使用这种变量是非法的。
如:&&void&delay(unsigned&int&&x)
&&&&&&{&unsigned&char&&i,j;&&//i&&j&&的作用域只是在delay函数内
关于局部变量的作用域的几点说明:
1、主函数中定义的变量也只能在主函数中使用,不能在其他函数中使用。同时,主函数中也不能使用其他函数中定义的变量。因为主函数也是一个函数,它与其他函数是平行关系。
2、形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。
3、允许在不同函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。
4、在复合语句中也可以定义变量,其作用域只是在复合语句范围内。
&&&比如:&&&main(&void)
&&&&&&&&&Int&s,a;
&&&&&&&&&&&
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&Int&b;
&&&&&&&&&&&&&&&&s=a+b;
&&&&&&&&&&&&&&&&&&&&&&&//b的作用域
&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&//s,a的作用域
&&&&&&&&&}
也称外部变量,在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序。在函数中使用全局变量,一般要作全局变量说明。只有在函数内经过说明的全局变量才能使用。全局变量的说明符extern。但在一个函数之前定义的全局变量,在该函数内使用可不再加以说明。
如:&&&&int&a,b;&//&外部变量&&a,b
&&&&&&&&Void&&&f1(&)
&&&&&&&&&&&&
&&&&&&&&&}&
&&&&&&&Float&&x,y;//外部变量&&x,y
&&&&&&&&Int&&f2(&)
&&&&&&&&{
&&&&&&&&&&&&
&&&&&&&&&}
&&&&&&&&Main(&&)
&&&&&&&&{
&&&&&&&&&&&
&&&&&&&&&}
在上例中,a&b&x&y都是在函数外部定义的外部变量,都是全局变量,但是x&y定义在F1函数之后,在F1中又无对x&y的说明,所以x&y在F1函数中是无效的,a&b&定义在源程序的最前面,因此在F1&F2及main函数中即使不加以说明仍然可以使用。这也是在编程中把全局变量写在程序函数之前的原因。
如果同一个源文件中,外部变量与局部变量同名,则局部变量的作用范围内,外部变量被&屏蔽&即不起作用。
用extern声明外部变量
外部变量是在函数的外部定义的变量,其作用域是从变量定义处开始,到本程序文件的末尾。如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件的结尾。如果在定义点之前的函数想引用该外部变量,则应在引用之前用关键字extern对该变量作&外部变量声明&。表示该变量是一个已经定义的外部变量。
unsigned&int&&a,b;
void&sumab()
&unsigned&int&s1,s2&;
&extern&unsigned&int&x,y;
void&main()
&while(1);
unsigned&int&x=3,y=4;
程序的最后1行定义了外部变量x,y,但由于外部变量定义的位置在函数main之后,本来是在main中不能引用外部变量x,y。当在main函数中用extern对x,y进行了&外部变量声明&,就可以从&声明&处起,合理的使用该外部变量x和y。
变量的存储类别
动态存储方式和静态存储方式
变量从作用域(空间)上分为全局变量和局部变量。
从存在的时间(生存期)的角度可分为静态存储方式和动态存储方式。
静态存储方式:在程序运行期间分配固定的存储空间的方式。
动态存储方式:在程序运行期间根据需要进行动态的分配存储空间的方式。
用户存储空间可以分为三个部分:
2、静态存储区
3、动态存储区
全局变量全部存放在静态存储区,在程序开始执行时给全局变量分配存储区,程序执行完毕就释放,在程序执行的过程中它们占据固定的存储单元,而不动态的进行分配和释放。
动态存储区存放如下的数据:
1、函数形式参数
2、自动变量(未加static声明的局部变量)
3、函数调用的现场保护和返回地址;
对于上面的数据,在函数开始调用时分配动态存储空间,函数结束时释放这些空间。
在C中,每个变量和函数有两个属性:数据类型和数据的存储类别。
局部变量,如不专门声明是static存储类别,都是动态地分配存储空间的,数据存储在动态存储区中。自动变量用关键字auto作为存储类别的声明。也可以隐含不写,系统默认是auto.
static声明局部变量
加入希望函数中的局部变量的值在函数调用后不消失而是保留原值,这时可以将局部变量用static进行声明,变为&静态局部变量&。
对静态局部变量的说明:
1、静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序运行期间都不释放。
2、静态局部变量在编译时赋初值,即只赋初值一次;而对自动变量赋初值是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。
3、如果在定义局部变量时不赋初值的话,对静态局部变量来说,编译时自动赋初值0或空字符。而对自动变量来说,如果不赋初值则它的值是一个不确定的值。
Register变量
为了提高效率,C允许将局部变量的值放在CPU中的寄存器中,这种变量就叫寄存器变量,用关键字register声明。
1、只有局部变量和形式参数可以作为寄存器变量
2、一个计算机系统中的寄存器数目是有限的,不能定义任意多个寄存器变量。
3、局部静态变量不能被定义成寄存器变量。
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
C语言相关资源
变量详解相关资源
编辑:什么鱼
本文引用地址:
本周热门资源推荐
EEWORLD独家C语言中static全局变量与普通的全局变量的区别
static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
全局变量(外部变量)的说明之前再冠以static
就构成了静态的全局变量。全局变量本身就是静态存储方式,
静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,
即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
从以上分析可以看出,
把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,
限制了它的使用范围。
static函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件
static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;
static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
程序的局部变量存在于(堆栈)中,全局变量存在于(静态区)中,动态申请数据存在于(
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。posts - 353,&
comments - 44,&
trackbacks - 0
关于全局/局部变量,静态/非静态变量的问题总结:
http:///view/1ed9ad51f3ba.html
一、c程序存储空间布局  C程序一直由下列部分组成:  1)正文段&&CPU执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令;  2)初始化数据段(数据段)&&在程序中所有赋了初值的全局变量,存放在这里。  3)非初始化数据段(bss段)&&在程序中没有初始化的全局变量;内核将此段初始化为0。&&&&& 4)栈&&增长方向:自顶向下增长;自动变量以及每次函数调用时所需要保存的信息(返回地址;环境信息)。  5)堆&&动态存储分。是向高地址扩展的数据类型,是自下向上的扩展方式。二、&面向过程程序设计中的static  1. 全局静态变量  在全局变量之前加上关键字static,全局变量就被定义成为一个全局静态变量。  1)内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在)  2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)  3)作用域:全局静态变量在声明他的文件之外是不可见的。准确地讲从定义之处开始到文件结尾。  定义全局静态变量的好处:  &1&不会被其他文件所访问,修改  &2&其他文件中可以使用相同名字的变量,不会发生**。  2. 局部静态变量  在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。  1)内存中的位置:静态存储区  2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化) && 3)作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束。  注:当static用来修饰局部变量的时候,它就改变了局部变量的存储位置,从原来的栈中存放改为静态存储区。但是局部静态变量在离开作用域之后,并没有被销毁,而是仍然驻留在内存当中,直到程序结束,只不过我们不能再对他进行访问。  当static用来修饰全局变量的时候,它就改变了全局变量的作用域(在声明他的文件之外是不可见的),但是没有改变它的存放位置,还是在静态存储区中。  3. 静态函数  在函数的返回类型前加上关键字static,函数就被定义成为静态函数。  函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。  定义静态函数的好处:  &1& 其他文件中可以定义相同名字的函数,不会发生**  &2& 静态函数不能被其他文件所用。存储说明符auto,register,extern,static,对应两种存储期:自动存储期和静态存储期。  auto和register对应自动存储期。具有自动存储期的变量在进入声明该变量的程序块时被建立,它在该程序块活动时存在,退出该程序块时撤销。  关键字extern和static用来说明具有静态存储期的变量和函数。用static声明的局部变量具有静态存储持续期(static storage duration),或静态范围(static extent)。虽然他的值在函数调用之间保持有效,但是其名字的可视性仍限制在其局部域内。静态局部对象在程序执行到该对象的声明处时被首次初始化。
三、&生存周期
&局部变量在每次函数调用的时候分配空间,在函数调用结束之后销毁。全局变量在程序开始运行时分配空间,在程序结束时销毁。如果局部变量和全局变量重名,局部变量会暂时覆盖掉全局变量。另外,全局变量只能用常量表达式初始化,因为程序开始运行时要用适当的值来初始化全局变量,所以初始值必须保存在编译生成的可执行文件中,因此初始值在编译时要计算出来。c语言从语法上规定,全局变量只能用常量表达式初始化。比如两个全局变量:int a = 1;int b = a + 1;虽然a的值在编译的时候能够计算出来,但是a+1不是常量表达式,不符合语法规定。再另外,全局变量不初始化,则初始值是0,局部变量不初始化,初始值不确定。切记。static 还可以修饰函数,表示该函数只能在本文件中使用
阅读(...) 评论()}

我要回帖

更多关于 c语言中静态变量 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信