static局部变量
static在c中的用法
static在C中的用法在C语言中,static是一个关键字,用于修饰变量、函数和块作用域。
它可以改变它所修饰实体的生命周期、作用域和可见性。
本文将介绍static关键字在C语言中的多种用法。
1. 静态变量使用static关键字修饰的变量被称为静态变量(Static Variables)。
静态变量具有以下特点:•静态变量存储在静态数据区,不随函数调用结束而销毁;•静态变量的作用域局限于定义它的代码块;•静态变量只能被初始化一次,在整个程序运行期间保持其值。
下面是一个示例,展示了静态变量的使用:#include <stdio.h>void increment() {static int count = 0; // 静态变量countcount++;printf("Count: %d\n", count);}int main() {increment(); // 输出:Count: 1increment(); // 输出:Count: 2increment(); // 输出:Count: 3return 0;}在上述示例中,函数increment()内部定义了一个静态变量count。
每次调用该函数时,count会自增,并输出当前值。
由于静态变量的生命周期不受函数调用的影响,所以每次调用increment()时,count的值都会被保留。
2. 静态函数使用static关键字修饰的函数被称为静态函数(Static Functions)。
静态函数具有以下特点:•静态函数只在定义它的源文件中可见,不能被其他源文件调用;•静态函数不能被其他源文件通过函数指针调用;•静态函数不会与其他源文件中同名的全局函数产生冲突。
下面是一个示例,展示了静态函数的使用:#include <stdio.h>static void printMessage() {printf("This is a static function.\n");}int main() {printMessage(); // 正常调用静态函数return 0;}在上述示例中,我们定义了一个静态函数printMessage()。
c语言的static用法
c语言的static用法在C语言中,static关键字主要用于修饰局部变量、全局变量和函数。
以下是static在不同场景下的用法:1. 静态局部变量:静态局部变量是在函数内部定义的变量,使用static修饰。
在声明时,编译器会把它初始化为0。
与普通局部变量相比,静态局部变量的生命周期更长,它位于进程的全局数据区,即使函数返回,它的值也会保持不变。
示例:```c#include <stdio.h>void test(){static int a = 1; // 初始化为1printf("a = %d\n", a);}int main(){while (1){test();}return 0;}```2. 静态全局变量:静态全局变量定义在函数体外部,使用static修饰。
它位于进程的全局数据区,初始化为0。
静态全局变量在声明后,其值不会因为函数的调用而改变。
示例:```c#include <stdio.h>static int global_var = 0;void test(){global_var = 1; // 允许修改静态全局变量的值printf("global_var = %d\n", global_var);}int main(){test();return 0;}```3. 静态函数:静态函数是用static修饰的函数。
静态函数在程序内部只能被调用一次,即在程序生命周期内只能被初始化一次。
静态函数可以在任何地方定义,但在其他地方不能被直接调用。
示例:```c#include <stdio.h>static void static_func(){printf("This is a static function.\n");}void test(){static_func(); // 正确调用静态函数printf("Test function.\n");}int main(){test();return 0;}```总之,C语言中的static关键字用于定义静态局部变量、静态全局变量和静态函数,它们的值在程序生命周期内保持不变,且具有特定的初始化方式和调用限制。
static全局变量与普通的全局变量有什么区别
(1)用于全局变量:外部静态变量,只能在本源文件中被引用,不能被其它源文件所引用。
(2)用于局部变量:局部静态变量,在函数返回后存储单元不释放;下一次调用该函数时,该变量为上次函数返回时的值。
(3)用于函数:内部函数,只能被本源文件中的函数所调用,不能被其它源文件调用。
Static全局变量与普通的全局变量有什么区别:1.static全局变量只初使化一次,防止在其他文件单元中被引用;2.static局部变量只被初始化一次,下一次依据上一次结果值;3.static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝const关键字在C语言中用于声明”只读变量”,其值不可修改,但具有确定的数据类型。
C 编译器总是为其分配相应的存储单元。
在C++中,const关键字用于声明常量,C++编译器视具体情况决定是为其分配存储单元还是仅将其作为编译期间的常量。
在C++中,还可以修饰类的成员函数,不改变类中的数据成员.被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。
char * const p; //常量指针,p的值不可以修改char const * p;//指向常量的指针,指向的常量值不可以改const char *p; //和char const *pASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。
如果表达式不为0,则继续执行后面的语句。
这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了就终止程序以免导致严重后果,同时也便于查找错误。
例如,变量n在程序中不应该为0,如果为0可能导致错误,你可以这样写程序:const作用:修饰变量、修饰函数参数、修饰函数返回值三个作用。
被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。
1)const变量有数据类型,而宏常量没有数据类型。
c语言中static的用法,包括全局变量和局部变量用static修饰
c语⾔中static的⽤法,包括全局变量和局部变量⽤static修饰⼀、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⽤来修饰局部变量的时候,它就改变了局部变量的存储位置,从原来的栈中存放改为静态存储区。
但是局部静态变量在离开作⽤域之后,并没有被销毁,⽽是仍然驻留在内存当中,直到程序结束,只不过我们不能再对他进⾏访问。
C#中的局部static变量
C#中的局部static变量 其实这问题没什么可讨论的,C#不⽀持局部静态变量。
但还是想了⼀下C#为什么不⽀持局部静态变量,以下均是个⼈想法。
C++和C⽀持局部静态变量,也就是在⼀个函数的内部声明⼀个静态变量,这种变量的特定如下:静态局部变量在函数内定义,但不象⾃动变量那样,当调⽤时就存在,退出函数时就消失。
静态局部变量始终存在着,也就是说它的⽣存期为整个程序的⽣命周期静态局部变量的⽣存期虽然为整个源程序,但是其作⽤域仍与⾃动变量相同,即只能在定义该变量的函数内使⽤该变量。
退出该函数后,尽管该变量还继续存在,但不能使⽤它⽣命变量的同时可以⽤初始化语句对静态变量进⾏赋值,该赋值语句只在函数第⼀次被调⽤时执⾏,即只执⾏⼀次如果没有初始化语句,则编译器采⽤该类型的默认值初始化变量 但在C#中却⽆法声明这种存在于函数内部的静态变量,会出现编译错误,仔细想来,原因可能如下: C++和C均不是完全⾯向对象的编程语⾔,即有很多函数不属于任何类或类的实例,如果需要函数的某个变量具有“保留上⼀次函数调⽤时的值”的特性,有三种⽅法:声明全局变量声明全局静态变量声明局部静态变量 全局变量和全局静态变量虽然可以实现某个变量“保留上⼀次函数调⽤时的值”的特性,但这两种变量的作⽤域较⼤,全局变量作⽤域为整个源程序,全局静态变量的作⽤域为变量声明所在的CPP⽂件,过⼤的变量作⽤域会造成安全隐患,因为该变量还可以被其他全局函数甚⾄类的成员函数调⽤,所以采⽤局部静态变量是最好的选择。
既保证了变量具有“记忆”功能,有很好的限制了变量的作⽤域或者说可见性。
与之相对,C#是完全⾯向对象的语⾔,任何变量或任何函数均应属于类或类的实例,这时C++中局部静态变量的功能可以由类的静态成员变量来实现,唯⼀不同的地⽅便是该变量的可见性的最⼩范围是类的内部(私有静态变量),⽽不是C++中局部静态变量的函数内部,稍微扩⼤了变量的作⽤域。
但我认为这个缺憾是可以接受的,否则或破坏“类”这个概念的完备性,在⾯向对象的编程的语⾔中,类或类实例是最基本的组成单元,类的任何成员在类内部都应该是可见的,如果有局部静态变量这个概念存在,那么就好像你的家中有⼀部车,但是你却没有权利去开⼀样。
static在vb中的用法
static在vb中的用法Static在VB中的用法Static是VB中的一个关键字,它用于定义静态变量。
静态变量是指在程序运行期间只初始化一次的变量,它们的值会在多次调用该函数时保持不变。
这种变量对于需要保留先前状态或计数器等情况非常有用。
本文将详细介绍Static在VB中的用法。
一、Static关键字的定义Static关键字用于定义静态变量,它可以修饰函数、过程或模块级别的变量。
当使用Static关键字时,该变量被赋予了一个初始值,并且这个值会在程序执行期间保持不变。
二、函数中使用Static1. 函数中声明静态局部变量当函数需要保留先前状态时,可以使用静态局部变量。
例如:Function Count() As IntegerStatic i As Integeri = i + 1Count = iEnd Function此函数被调用多次后,每次返回的值都会递增1。
2. 函数中声明静态私有变量如果需要在多个函数之间共享数据,可以使用静态私有变量。
例如:Private Static count As IntegerFunction Increment() As Integercount = count + 1Increment = countEnd FunctionFunction Decrement() As Integercount = count - 1Decrement = countEnd Function这两个函数都可以访问count变量,它们的返回值会根据count的值而变化。
三、过程中使用Static1. 过程中声明静态局部变量与函数中使用Static相同,可以在过程中声明静态局部变量。
例如:Sub Count()Static i As Integeri = i + 1MsgBox "Count: " & iEnd Sub每次调用该过程后,i的值都会递增1。
static的用法c语言
static的用法c语言
在C语言中,关键字static有多种用法和含义。
以下是一些常见的用法:
1. 声明静态变量:在函数内部使用static关键字声明的变量是静态变量。
静态变量与普通的局部变量不同,它们的生命周期延长到整个程序的执行期间,而不是在函数执行完毕后被销毁。
此外,静态变量的作用域仅限于声明的函数内部。
2. 声明静态全局变量:在函数外部使用static关键字声明的变量是静态全局变量。
静态全局变量与普通的全局变量不同,它们的作用域仅限于声明的源文件内,不能被其他源文件访问。
3. 声明静态函数:使用static关键字声明的函数是静态函数。
静态函数的作用域仅限于声明的源文件内,不能被其他源文件调用。
通常将不需要在其他文件中使用的函数声明为静态函数,以避免与其他文件中的函数命名冲突。
4. 限定函数的访问权限:在结构体或类中,使用static关键字可以限定函数的访问权限。
声明为static的函数只能在同一源文件中的其他函数调用,不能通过结构体或类的对象或指针访问。
5. 限定外部链接的变量:在声明全局变量时使用static关键字,可以将变量的链接属性变为内部链接,即只能在当前源文件中使用,其他源文件无法访问该变量。
需要注意的是,static关键字的具体用法和效果可能有所依赖于编译器和环境的差异。
因此,在具体开发项目中,应该深入了解并遵循所使用的编译器的规范和行为。
static局部变量
static局部变量在局部变量前面加关键字static进行声明,该变量就是一个static局部变量。
static局部变量的特点是它位于静态存贮区,在函数调用结束后,它的值仍然存在,并可能影响到下一次调用的过程。
下面用一个简单的例子来说明:int f(inti){int a=0;staticint c=1;c=c+i;return c;}main(){printf("%d\n",f(1));printf("%d\n",f(1));}程序运行的结果为23main函数两次调用了函数f,得到了不同的返回值。
在这段程序中,static int c=1;定义了静态局部变量c并将它初始化为1。
由于c是静态变量,保存在静态存贮区,程序开始运行时c就存在,也就是说static int c=1在程序运行时就已经执行完毕;程序执行每次函数f的调用,进入f函数后,static int c=1这条定义并不起作用。
与之不同的是,变量a属于auto型变量,每次函数调用进入f后,在动态存贮区为a分配内存并初始化为0,函数调用结束后,a的内存被释放。
下面分析一下程序的执行过程:(1)程序开始后,首先为int型变量c在静态存贮区里分配内存,并赋初值1;(2)程序进入main函数后,执行第一个printf语句,首次调用函数f,将实际参数1传递给f的形式参数i;(3)程序进入函数f后,为变量a动态分配内存,但由于c是静态变量,因此跳过static int c=1的定义,执行c=c+i,结果c被重新赋值为2;(4)函数返回2,主程序打印输出2。
注意用于c是静态变量,函数返回后它仍然存在,值为2。
(5)程序执行第二个printf语句,再次调用函数f,仍然传递1给i;(6)进入函数后,c的值是上次调用后的2,因此执行c=c+i后被赋值为3,函数返回3,主程序打印输出3;(7)程序结束,释放静态变量c。
c语言static 的三个作用
c语言static 的三个作用static是C语言中的关键字,常用于定义变量和函数。
它有三个主要的作用:作用域限定、生命周期延长和隐藏实现。
一、作用域限定:1.1局部变量的作用域限定:在函数内部使用static修饰的局部变量,使其只能在定义它的函数内部使用,不能被其他函数访问。
这样可以避免在不同函数中使用相同名称的变量造成的冲突。
1.2函数的作用域限定:在函数外部使用static修饰的函数,使其只能在本文件内部使用,不能被其他文件调用。
这主要用于隐藏一些辅助性的函数,提高程序的安全性和模块化程度。
二、生命周期延长:2.1局部变量的生命周期延长:使用static修饰的局部变量,在程序运行时一直存在,不会随着函数执行结束而销毁,直到程序结束才会被销毁。
这样可以在多次调用函数时保持变量的值不变,起到记忆的作用。
2.2全局变量的生命周期延长:使用static修饰的全局变量,生命周期同样延长到整个程序运行期间。
这样可以在不同的函数中共享同一个全局变量,达到数据共享的目的。
三、隐藏实现:使用static修饰的变量和函数,其作用域被限定在本文件内部,其他文件无法直接使用和访问,从而隐藏了其具体的实现细节。
这样可以提高程序的安全性和可维护性,使得代码更加模块化。
下面进一步解释每个作用:1.作用域限定:1.1局部变量的作用域限定在函数内部使用static修饰局部变量,该变量只能在定义它的函数内部使用,无法在其他函数中使用。
这种限制避免了在不同的函数中多次声明相同名称的变量带来的冲突。
同时,static修饰的局部变量在函数执行完毕后并不销毁,而是保留其值,下次再次调用该函数时,仍能使用先前存储的值。
比如:```cvoid func() {static int count = 0;count++;printf("%d\n", count);}```在上面的例子中,count是一个静态局部变量,每次调用func函数时,count的值会自增并输出。
c语言中static关键字用法详解
c语言中static关键字用法详解https:///guotianqing/article/details/79828100 概述static关键字在c语言中比较常用,使用恰当能够大大提高程序的模块化特性,有利于扩展和维护。
但是对于c语言初学者,static由于使用灵活,并不容易掌握。
本文就static在c语言中的应用进行总结,供参考使用。
错漏之处,请不吝指正。
在程序中使用static变量1. 局部变量普通局部变量是再熟悉不过的变量了,在任何一个函数内部定义的变量(不加static修饰符)都属于这个范畴。
编译器一般不对普通局部变量进行初始化,也就是说它的值在初始时是不确定的,除非对其显式赋值。
普通局部变量存储于进程栈空间,使用完毕会立即释放。
静态局部变量使用static修饰符定义,即使在声明时未赋初值,编译器也会把它初始化为0。
且静态局部变量存储于进程的全局数据区,即使函数返回,它的值也会保持不变。
变量在全局数据区分配内存空间;编译器自动对其初始化其作用域为局部作用域,当定义它的函数结束时,其作用域随之结束小程序体会一下静态局部变量的威力:#include <stdio.h>void fn(void){int n = 10;printf("n=%d\n", n);n++;printf("n++=%d\n", n);}void fn_static(void){static int n = 10;printf("static n=%d\n", n);n++;printf("n++=%d\n", n);}int main(void){fn();printf("--------------------\n"); fn_static();printf("--------------------\n"); fn();printf("--------------------\n"); fn_static();return 0;}运行结果如下:-> % ./a.outn=10n++=11--------------------static n=10n++=11--------------------n=10n++=11--------------------static n=11n++=12可见,静态局部变量的效果跟全局变量有一拼,但是位于函数体内部,就极有利于程序的模块化了。
全局变量、静态全局变量、静态局部变量和局部变量的区别
全局变量、静态全局变量、静态局部变量和局部变量的区别变量变量可以分为:全局变量、静态全局变量、静态局部变量和局部变量。
按存储区域分:全局变量、静态全局变量和静态局部变量都存放在内存的静态存储区域,局部变量存放在内存的栈区。
按作⽤域分:全局变量在整个⼯程⽂件内都有效;静态全局变量只在定义它的⽂件内有效;静态局部变量只在定义它的函数内有效,只是程序仅分配⼀次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,但是函数返回后失效。
static全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。
全局变量本⾝就是静态存储⽅式,静态全局变量当然也是静态存储⽅式。
这两者在存储⽅式上并⽆不同。
两者的区别虽在于⾮静态全局变量的作⽤域是整个源程序, 当⼀个源程序由多个源⽂件组成时,⾮静态的全局变量在各个源⽂件中都是有效的。
⽽静态全局变量则限制了其作⽤域,即只在定义该变量的源⽂件内有效, 在同⼀源程序的其它源⽂件中不能使⽤它。
由于静态全局变量的作⽤域局限于⼀个源⽂件内,只能为该源⽂件内的函数公⽤, 因此可以避免在其它源⽂件中引起错误。
从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储⽅式即改变了它的⽣存期。
把全局变量改变为静态变量后是改变了它的作⽤域, 限制了它的使⽤范围。
static函数与普通函数作⽤域不同。
仅在本⽂件。
只在当前源⽂件中使⽤的函数应该说明为内部函数(static),内部函数应该在当前源⽂件中说明和定义。
对于可在当前源⽂件以外使⽤的函数,应该在⼀个头⽂件中说明,要使⽤这些函数的源⽂件要包含这个头⽂件。
⼩结static全局变量与普通的全局变量有什么区别:static全局变量只初使化⼀次,防⽌在其他⽂件单元中被引⽤。
static局部变量和普通局部变量有什么区别:static局部变量只被初始化⼀次,下⼀次依据上⼀次结果值。
static函数与普通函数有什么区别:static函数在内存中只有⼀份,普通函数在每个被调⽤中维持⼀份拷贝。
staticvoid和void区别(转)
staticvoid和void区别(转)static关键字1.作用于变量:用static声明局部变量-------局部变量指在代码块{}内部定义的变量,只在代码块内部有效(作用域),其缺省的存储方式是自动变量或说是动态存储的,即指令执行到变量定义处时才给变量分配存储单元,跳出代码块时释放内存单元(生命期)。
用static声明局部变量时,则改变变量的存储方式(生命期),使变量成为静态的局部变量,即编译时就为变量分配内存,直到程序退出才释放存储单元。
这样,使得该局部变量有记忆功能,可以记忆上次的数据,不过由于仍是局部变量,因而只能在代码块内部使用(作用域不变)。
用static声明外部变量-------外部变量指在所有代码块{}之外定义的变量,它缺省为静态变量,编译时分配内存,程序结束时释放内存单元。
同时其作用域很广,整个文件都有效甚至别的文件也能引用它。
为了限制某些外部变量的作用域,使其只在本文件中有效,而不能被其他文件引用,可以用static关键字对其作出声明。
总结:用static声明局部变量,使其变为静态存储方式,作用域不变;用static声明外部变量,其本身就是静态变量,这只会改变其连接方式,使其只在本文件内部有效,而其他文件不可连接或引用该变量。
2.作用于函数:使用static用于函数定义时,对函数的连接方式产生影响,使得函数只在本文件内部有效,对其他文件是不可见的。
这样的函数又叫作静态函数。
使用静态函数的好处是,不用担心与其他文件的同名函数产生干扰,另外也是对函数本身的一种保护机制。
如果想要其他文件可以引用本地函数,则要在函数定义时使用关键字extern,表示该函数是外部函数,可供其他文件调用。
另外在要引用别的文件中定义的外部函数的文件中,使用extern声明要用的外部函数即可。
参考资料:①《 C程序设计(第二版)》,谭浩强②《 Pointers on C 》,Kenneth A.Reekvoid和void指针void的含义void即“无类型”,void *则为“无类型指针”,可以指向任何数据类型。
PHPstatic局部静态变量和全局静态变量总结
PHPstatic局部静态变量和全局静态变量总结1.不会随着函数的调⽤和退出⽽发⽣变化,不过,尽管该变量还继续存在,但不能使⽤它。
倘若再次调⽤定义它的函数时,它⼜可继续使⽤,⽽且保存了前次被调⽤后留下的值2.静态局部变量只会初始化⼀次3.静态属性只能被初始化为⼀个字符值或⼀个常量,不能使⽤表达式。
即使局部静态变量定义时没有赋初值,系统会⾃动赋初值0(对数值型变量)或空字符(对字符变量);静态变量的初始值为0。
4.当多次调⽤⼀个函数且要求在调⽤之间保留某些变量的值时,可考虑采⽤静态局部变量。
虽然⽤全局变量也可以达到上述⽬的,但全局变量有时会造成意外的副作⽤,因此仍以采⽤局部静态变量为宜。
复制代码代码如下:function test(){static $var = 5; //static $var = 1+1;就会报错$var++;echo $var . ' ';}test(); //2test(); //3test(); //4echo $var; //报错:Notice: Undefined variable: var复制代码代码如下://全局变量本⾝就是静态存储⽅式,所有的全局变量都是静态变量function static_global(){global $glo;$glo++;echo $glo.'<br>';}static_global(); //1static_global(); //2static_global(); //3echo $glo . '<br>'; //3所以静态全局变量使⽤并不多。
static变量构造析构顺序
静态变量的构造和析构顺序如下:
1. 在main函数之前,全局静态变量和静态局部变量会被初始化一次。
如果静态变量有多个声明,那么它们会按照声明的顺序进行初始化。
2. 在main函数中,静态局部变量会在main函数每次被调用时进行初始化。
3. 当main函数结束时,静态局部变量的析构函数会被调用,然后这些静态局部变量的内存会被释放。
4. 在全局范围(例如其他函数或者全局变量的声明部分)结束后,全局静态变量和静态函数(如果定义了的话)会被析构。
需要注意的是,静态变量的初始化和析构只会执行一次。
在C++中,静态变量的初始化是按照声明的顺序进行的,而析构则是按照构造的逆序进行的。
cc++中static用法总结
cc++中static⽤法总结static的作⽤主要有两种:第⼀个作⽤是限定作⽤域;第⼆个作⽤是保持变量内容持久化;c语⾔中static的⽤法:1、全局静态变量: ⽤法:在全局变量前加上关键字static,全局变量就定义成⼀个全局静态变量。
static int temp; 内存中的位置:静态存储区,在整个程序运⾏期间⼀直存在。
初始化:未经初始化的全局静态变量会被⾃动初始化为0(⾃动对象的值是任意的,除⾮他被显式初始化); 作⽤域:全局静态变量在声明他的⽂件之外是不可见的,准确地说是从定义之处开始,到⽂件结尾。
2、局部静态变量: 在局部变量之前加上关键字static,局部变量就成为⼀个局部静态变量。
内存中的位置:静态存储区 初始化:未经初始化的全局静态变量会被⾃动初始化为0(⾃动对象的值是任意的,除⾮他被显式初始化); 作⽤域:作⽤域仍为局部作⽤域,当定义它的函数或者语句块结束的时候,作⽤域结束。
但是当局部静态变量离开作⽤域后,并没有销毁,⽽是仍然驻留在内存当中,只不过我们不能再对它进⾏访问,直到该函数再次被调⽤,并且值不变;3、静态函数: 在函数返回类型前加关键字static,函数就定义成静态函数。
函数的定义和⽣命在默认情况下都是extern的,但静态函数只是在声明他的⽂件当中可见,不能被其他⽂件所⽤;c++中static的⽤法: 1、类的静态成员: class A{ private: static int val; }; 在cpp中必须对他进⾏初始化,初始化时使⽤作⽤域运算符来标明他所属类,其属于该类的所有成员共有,只有⼀个拷贝; 2、类的静态成员函数: class A{ private: static int func(int x); }; 实现的时候也不需要static的修饰,因为static是声明性关键字;类的静态函数是该类的范畴内的全局函数,不能访问类的私有成员,只能访问类的静态成员,不需要类的实例即可调⽤;实际上,他就是增加了类的访问权限的全局函数; void A::func(int); 静态成员函数可以继承和覆盖,但⽆法是虚函数; 3、只在cpp内有效的全局变量: 在cpp⽂件的全局范围内声明: static int val = 0; 这个变量的含义是该cpp内有效,但是其他的cpp⽂件不能访问这个变量;如果有两个cpp⽂件声明了同名的全局静态变量,那么他们实际上是独⽴的两个变量; 4、只在cpp内有效的全局函数: 函数的实现使⽤static修饰,那么这个函数只可在本cpp内使⽤,不会同其他cpp中的同名函数引起冲突; warning:不要再头⽂件中声明static的全局函数,不要在cpp内声明⾮static的全局函数,如果你要在多个cpp中复⽤该函数,就把它的声明提到头⽂件⾥去,否则cpp内部声明需加上static修饰;。
C语言中static用法介绍
C语⾔中static⽤法介绍
C语⾔中static⽤法介绍
对于新⼿来说,很多东西的⽤法还不是很清楚,我们今天⼀起来看看C语⾔中static⽤法介绍
1、声明了static的变量称为静态变量,根据作⽤域的不同⼜分为静态局部变量与静态全局变量。
其中静态局部变量是在函数内声明的static变量,静态全局变量是在函数外声明的static变量。
虽然作⽤域不同,但是都是在编译期间分配内存,使⽤静态存储的⽅式(其值存放在静态存储区),在程序整个执⾏期间都是存在的。
它们之间的区别是:
a、静态局部变量的作⽤域仅限于其所在的函数,在函数外⽆法对该变量进⾏访问。
此外,该变量的值在该函数退出时依然存在,并且下次调⽤该函数时使⽤的是上次保存的值;
b、静态全局变量的作⽤域仅限于其所在的⽂件模块,在其它⽂件模块中⽆法访问该变量。
2、声明了static的函数⼜称为静态函数或内部函数,其作⽤与静态全局变量差不多:其作⽤域仅限于其所在的⽂件模块,在其它⽂件模块中⽆法调⽤该函数(相对于其它⽂件块是不可见的);
3、全局变量没有使⽤static关键字也是静态存储(其值存放在静态存储区),也是在编译时分配内存,并且其值在整个程序执⾏其间都是存在的。
它与使⽤static关键字的静态全局变量唯⼀的不同在于作⽤域:它对其它⽂件模块是可见的,⽽静态全局变量只对其所在的⽂件模块可见。
函数里面的static变量
函数里面的static变量在C++中,static关键字可以用于函数内部的变量声明,这种变量被称为“函数内部的静态变量”,也称为“局部静态变量”。
与普通的局部变量不同,函数内部的静态变量在函数执行完毕后并不会被销毁,而是会一直存在于内存中,直到程序结束才会被销毁。
函数内部的静态变量具有以下特点:1. 只会被初始化一次:当函数第一次被调用时,静态变量会被初始化。
之后每次调用函数时,都会使用上一次的值,而不会重新初始化。
2. 作用域仅限于函数内部:静态变量只能在函数内部使用,无法在函数外部访问。
3. 生命周期长:静态变量的生命周期与程序的生命周期相同,即使函数执行完毕,静态变量仍然存在于内存中。
4. 存储在静态存储区:静态变量存储在静态存储区,而不是栈中。
因此,静态变量的内存空间是固定的,不会随着函数的调用次数而增加或减少。
函数内部的静态变量在实际编程中有很多应用场景。
例如,可以用它来记录函数被调用的次数,或者用它来缓存函数的计算结果,避免重复计算。
下面是一个简单的例子:```c++#include <iostream>using namespace std;int func() {static int count = 0; // 函数内部的静态变量count++;return count;}int main() {for (int i = 0; i < 5; i++) {cout << func() << endl;}return 0;}```上面的代码中,函数func()内部定义了一个静态变量count,每次调用函数时,count的值都会加1,并返回新的值。
由于count是静态变量,所以它的值会一直保存在内存中,不会被销毁。
因此,每次调用func()时,都会使用上一次的count值,并将其加1。
输出结果如下:```12345```可以看到,每次调用func()时,count的值都会增加,而不是重新从0开始计数。
c++中static的用法
c++中static的用法1.在函数中,static修饰的局部变量会在第一次调用该函数时被初始化,并且只会被初始化一次,即使函数被调用多次也不会重新初始化。
这种使用方式可以用来实现计数器等功能。
2. 在类中,static修饰的成员变量属于类本身,而不是类的实例。
这意味着可以在不创建对象的情况下访问该成员变量。
例如:```class MyClass {public:static int myStaticVar;};int MyClass::myStaticVar = 0;int main() {MyClass::myStaticVar = 1;return 0;}```3. 在类中,static修饰的成员函数也属于类本身,而不是类的实例。
这意味着可以在不创建对象的情况下调用该成员函数。
例如: ```class MyClass {public:static void myStaticFunc() {// do something}};int main() {MyClass::myStaticFunc();return 0;}```4. 在文件中,static修饰的全局变量或函数只能在当前文件范围内访问,无法被其他文件访问。
这种使用方式可以用来避免命名冲突或者隐藏实现细节。
例如:```static int myStaticVar = 0;static void myStaticFunc() {// do something}int main() {myStaticVar = 1;myStaticFunc();return 0;}```需要注意的是,static修饰的成员变量或函数虽然属于类本身,但是它们无法访问非静态成员变量或函数,因为它们没有this指针。
因此,在使用static修饰成员变量或函数时需要特别注意访问的限制。
静态方法的局部变量
静态方法的局部变量
静态方法中的局部变量并没有什么特别之处,它们与非静态方法中的局部变量相同。
不同之处在于,静态方法不需要访问对象的状态,因此它们不能使用非静态成员变量或方法。
在静态方法中定义的局部变量会在方法执行结束后被销毁,它们的生命周期与非静态方法中的局部变量相同。
以下是一个静态方法中使用局部变量的例子:
java
public class MyClass {
public static void myStaticMethod() {
int x = 10;
System.out.println("My static method: " + x);
}
}
在上面的例子中,`myStaticMethod()` 是一个静态方法,它使用了一个名为`x` 的局部变量。
在方法执行期间,`x` 的值为`10`,并且当方法执行结束时,`x` 被销毁。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
static局部变量
在局部变量前面加关键字static进行声明,该变量就是一个static局部变量。
static局部变量的特点是它位于静态存贮区,在函数调用结束后,它的值仍然存在,并可能影响到下一次调用的过程。
下面用一个简单的例子来说明:
int f(inti)
{
int a=0;
staticint c=1;
c=c+i;
return c;
}
main()
{
printf("%d\n",f(1));
printf("%d\n",f(1));
}
程序运行的结果为
2
3
main函数两次调用了函数f,得到了不同的返回值。
在这段程序中,static int c=1;定义了静态局部变量c并将它初始化为1。
由于c是静态变量,保存在静态存贮区,程序开始运行时c就存在,也就是说static int c=1在程序运行时就已经执行完毕;程序执行每次函数f的调用,进入f函数后,static int c=1这条定义并不起作用。
与之不同的是,变量a属于auto型变量,每次函数调用进入f后,在动态存贮区为a分配内存并初始化为0,函数调用结束后,a的内存被释放。
下面分析一下程序的执行过程:
(1)程序开始后,首先为int型变量c在静态存贮区里分配内存,并赋初值1;
(2)程序进入main函数后,执行第一个printf语句,首次调用函数f,将实际参数1传递给f的形式参数i;
(3)程序进入函数f后,为变量a动态分配内存,但由于c是静态变量,因此跳过static int c=1的定义,执行c=c+i,结果c被重新赋值为2;
(4)函数返回2,主程序打印输出2。
注意用于c是静态变量,函数返回后它仍然存在,值为2。
(5)程序执行第二个printf语句,再次调用函数f,仍然传递1给i;
(6)进入函数后,c的值是上次调用后的2,因此执行c=c+i后被赋值为3,函数返回3,主程序打印输出3;
(7)程序结束,释放静态变量c。
从上面的例子可以看到,static局部变量是一种比较特殊的变量。
从作用域来看,它是一种局部变量,因此它的作用域只能是当前的函数,也就是说,只能在当前函数内使用这个局部变量,其他函数不能引用它;但是,static局部变量存放在静态存贮区,它的生存期比较长,从程序开始运行它就开始存在,待程序结束后它被释放,从这个意义上说,它具有类似全局变量的效果。
static局部变量和auto局部变量的另一个不同是对初值的处理。
如果一个auto变量在定义
时没有赋初值,那么它是一个随机值;static局部变量如果没有赋初值,编译器将自动将其赋值为0(对于数值型变量)或空字符(对于字符型变量)。
利用static局部变量的特点,可以保存上次函数调用的某些结果,下面的例子利用static局部变量做累加,计算1+2+3+...+100的结果:
Add(int a)
{
staticint r=0;
r+=a;
return r;
}
main()
{
inti, sum;
for(i=1;i<=100;i++)
sum=Add(i);
printf("%d",sum);
}
程序运行的结果是:
5050
一般来说,在程序中尽量不用或少用static局部变量。
原因主要有:
(1)static局部变量的生存期长,比较浪费内存;
(2)使用static局部变量会导致函数的多次调用之间发生联系,使代码的可读性降低。