c语言中static 用法总结
- 格式:doc
- 大小:29.00 KB
- 文档页数:4


C语⾔之静态变量1、静态局部变量 有时候,我们希望函数中局部变量的值在函数调⽤结束之后不会消失,⽽仍然保留其原值。即它所占⽤的存储单元不释放,在下⼀次调⽤该函数时,其局部变量的值仍然存在,也就是上⼀次函数调⽤结束时的值。这时候,我们就应该将该局部变量⽤关键字 static 声明为“静态局部变量”。 当将局部变量声明为静态局部变量的时候,也就改变了局部变量的存储位置,即从原来的栈中存放改为静态存储区存放。这让它看起来很像全局变量,其实静态局部变量与全局变量的主要区别就在于可见性,静态局部变量只在其被声明的代码块中是可见的。
对某些必须在调⽤之间保持局部变量的值的⼦程序⽽⾔,静态局部变量是特别重要的。如果没有静态局部变量,则必须在这类函数中使⽤全局变量,由此也就打开了引⼊副作⽤的⼤门。使⽤静态局部变量最好的⽰例就是实现统计次数的功能,
静态局部变量在内定义,但不象普通的那样,当来调⽤时就存在,退出时就消失。静态始终存在着,也就是说它的为整个。
静态局部变量的虽然为整个,但是其仍与普通的相同,即只能在定义该变量的源内使⽤该变量。退出该函数后, 尽管该变量还继续存在,但不能使⽤它。
对基本类型的静态若在说明时未赋以初值,则系统⾃动赋予0值。⽽对不赋初值,则其值是不定的。
根据静态的特点, 可以看出它是⼀种为整个源⽂件的量。虽然离开定义它的百函数后不能使⽤,但如再次调⽤定义它的函数时,它⼜可继续使⽤, ⽽且保存了前次被调⽤后留下的值。 因此,当多次调⽤⼀个函数且要求在调⽤之间保留某些变量的值时,可考虑采⽤静态局部变量。虽然⽤全局变量也可以达到上述⽬的,但全局变量有时会造成意外的副作⽤(尤其是短名全局变量的变量名污染很严重),因此仍以采⽤局部为宜。
简单的说静态局部变量与全局变量最明显的区别就在于:全局变量在其定义后所有函数都能⽤,但是静度态局部变量只能在⼀个函数⾥⾯⽤。
2、静态全局变量
在 C 语⾔中,static 关键字不仅可以⽤来修饰变量,还可以⽤来修饰函数。在使⽤ static 关键字修饰变量时,我们称此变量为静态变量。
C语⾔中的保留字保留字:保留字⼜称关键字。指在⾼级语⾔中已经定义过的字,使⽤者不能再将这些字作为变量名或过程名使⽤。其中,C89中有下述:类型说明保留字:int,long,short,float,double,char,unsigned,signed,const,void,volatile,enum,struct,union语句定义保留字:if,else,goto,switch,case,do,while,for,continue,break,return,default,typedef存储类说明保留字:auto,register,extern,static长度运算符保留字:sizeof()return具体含义如下:auto指定变量的存储类型,是默认值break跳出循环或switch语句case定义switch中的case⼦句char定义字符型变量或指针const定义常量或参数continue在循环语句中,回到循环体的开始处重新执⾏循环default定义switch中的default⼦句do定义do-while语句double定义双精度浮点数变量else定义枚举类型enum声明外部变量或函数extern声明外部变量或函数float定义浮点型变量或指针for定义for语句goto定义goto语句if定义if语句或if-else语句int定义整型变量或指针long定义长整型变量或指针register指定变量的存储类型是寄存器变量,Turbo c中⽤⾃动变量代替return从函数返回short定义短整型变量或指针signed定义有符号的整型变量或指针sizeof获取某种类型的变量或数据所占内存的⼤⼩,是运算符static指定变量的存储类型是静态变量,或指定函数是静态函数static指定变量的存储类型是静态变量,或指定函数是静态函数struct定义结构体类型switch定义switch语句typedef为数据类型定义别名union定义⽆符号的整型或字符型变量或指针unsigned定义⽆符号的整型变量或数据void定义空类型变量或空类型指针,或指定函数没有返回值volatile变量的值可能在程序的外部被改变while定义while或do-while语句
c语⾔中static函数和普通函数的区别
C程序⼀直由下列部分组成:
1)正⽂段——CPU执⾏的机器指令部分;⼀个程序只有⼀个副本;只读,防⽌程序由于意外事故⽽修改⾃⾝指令;
2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这⾥。
3)⾮初始化数据段(bss段)——在程序中没有初始化的全局变量;内核将此段初始化为0。
4)栈——增长⽅向:⾃顶向下增长;⾃动变量以及每次函数调⽤时所需要保存的信息(返回地址;环境信息)。
5)堆——动态存储分。
在全局变量之前加上关键字static,全局变量就被定义成为⼀个全局静态变量。1)内存中的位置:静态存储区(静态存储区在整个程序运⾏期间都存在)
2)初始化:未经初始化的全局静态变量会被程序⾃动初始化为0(⾃动对象的值是任意的,除⾮他被显⽰初始化)
3)作⽤域:全局静态变量在声明他的⽂件之外是不可见的。准确地讲从定义之处开始到⽂件结尾。
好处:
定义全局静态变量的好处:<1>不会被其他⽂件所访问,修改
<2>其他⽂件中可以使⽤相同名字的变量,不会发⽣冲突。
局部静态变量
在局部变量之前加上关键字static,局部变量就被定义成为⼀个局部静态变量。1)内存中的位置:静态存储区
2)初始化:未经初始化的全局静态变量会被程序⾃动初始化为0(⾃动对象的值是任意的,除⾮他被显⽰初始化)
3)作⽤域:作⽤域仍为局部作⽤域,当定义它的函数或者语句块结束的时候,作⽤域随之结束。
注:当static⽤来修饰局部变量的时候,它就改变了局部变量的存储位置,从原来的栈中存放改为静态存储区。但是局部静态变量在离开作⽤域之后,并没有被
销毁,⽽是仍然驻留在内存当中,直到程序结束,只不过我们不能再对他进⾏访问。
当static⽤来修饰全局变量的时候,它就改变了全局变量的作⽤域(在声明他的⽂件之外是不可见的),但是没有改变它的存放位置,还是在静态存储区中。
3. 静态函数
在函数的返回类型前加上关键字static,函数就被定义成为静态函数。
char
含义:定义一个字符型变量或返回值
用法:定义(声明)一个字符变量或返回值
结构:类型说明符(共两种分别修饰变量和函数)
char 未定义变量名;
char 函数名([参数表])
{函数体;}
例:
char a;
char asd;
char x=’a’;
—————————————————
float
含义:定义小数型变量或返回值(单精度)
用法:定义(声明)一个小数变量或返回值
结构:定义结构(共两种分别修饰变量和函数)
float 未定义变量名;
float 函数名([参数表])
{函数体;}
例:
float a;
float asd;
float x=1.74;
—————————————————
double
含义:定义小数型变量或返回值(双精度)
用法:定义(声明)一个小数变量或返回值
结构:类型说明符(共两种分别修饰变量和函数)
double 未定义说明符;
double 函数名([参数表])
{函数体;}
例:
double a;
double asd;
double x=1.74;
—————————————————
int
含义:定义整数型变量或返回值
用法:定义(声明)一个整数变量或返回值
结构:定义结构(共两种分别修饰变量和函数)
int 未定义变量名;
int 函数名([参数表])
{函数体;}
例:
int a;
int asd;
int x=2;
—————————————————
long、short、unsigned、signed
含义:定义长、短整形,有、无符号整形
用法:放在int前修饰int(也可省去int直接写)可写成组合形式
结构:修饰定义(共两种分别修饰变量和函数)
[long/short] [unsigned/signed] [int] 未定义变量名;
[long/short] [unsigned/signed] [int] 函数-名([参数表])