c语言中static的作用,c语言中为什么要用static声明变量它的具体作用是什么请举例说明

1 , c语言中为什么要用static声明变量它的具体作用是什么请举例说明比如你在一个函数中定义了一个i,你想在每次调用的时候,显示了共调用了多少次,而且你又不想用全局变量,那么你就要定义成static类型的 。如果你实现了我说的功能 , 那你就可以理解static的作用了 。关键字static的作用是什么?这个简单的问题很少有人能回答完全 。在c语言中,关键字static有三个明显的作用:?; 在函数体 , 一个被声明为静态的变量在这一函数被调用过程中维持其值不变 。?; 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问 , 但不能被模块外其它函数访问 。它是一个本地的全局变量 。?; 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用 。那就是,这个函数被限制在声明它的模块的本地范围内使用 。例子可以参考我的下面url如果static申明的是全局变量 , 那么这个全局变量只能在这个编译单元(文件)使用 , 利于模块封装 。如果static申明的是局部变量,那么函数返回时将不会释放该变量空间 。例如,main.c里面定义了一个全局变量static int a;那么另外一个文件code.c将不能使用它,即使使用extern int a来申明它 。定义一个函数void func() {static int a = 0; a++;}那么每次执行该函数a+1 , 即第一次调用func,a为1,第二次为2,第三次为3……和全局变量很像,但其他函数是不能使用a 的//静态变量的生存期是整个程序的运行期,它被定义后就一直存在,要保留某个函数的中间结果,就可以用静态变量,比如下面这个程序#include <stdio.h>int f() static int i=1; printf("%d",i); i++; return i;}int main() f(); f(); f(); f();return 0;}1234请按任意键继续. . .
2,C语言中static的作用在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条 。(1)第一个作用:隐藏 。当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性 。为理解这句话,我举例来说明 。我们要同时编译两个源文件 , 一个是a.c,另一个是main.c 。下面是a.c的内容#include<cstdio>增加这条语句char a = A; // global variablevoid msg()printf("Hello\n"); }你可能会问:为什么在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还是用来隐藏的 。(3)static的第三个作用是默认初始化为0 。其实全局变量也具备这一属性,因为全局变量也存储在静态数据区 。在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量 。最后对static的三条作用做一句话总结 。首先static的最主要功能是隐藏,其次因为static变量存放在静态存储区,所以它具备持久性和默认值0 。下面是main.c的内容除了头文件,需要声明函数:void msg();int main(void) extern char a; // extern variable must be declared before use printf("%c ", a); (void)msg(); return 0;}
3 , 一个C语言程序其中static的作用是什么在这个程序中 static 没有什么用处 。对于被调用的函数来说 加上static 可以让变量值在被调用的时候,还是上次函数退出时的值 。对于你的程序 main不会被重复调用所以这里加不加都一样 。在c语言中,static的字面意思很容易把我们导入歧途 , 其实它的作用有三条 。(1)第一个作用:隐藏 。当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性 。为理解这句话,我举例来说明 。我们要同时编译两个源文件,一个是a.c , 另一个是main.c 。下面是a.c的内容#include增加这条语句 char a = a; // global variable void msg() { printf("hello\n"); } 你可能会问:为什么在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还是用来隐藏的 。(3)static的第三个作用是默认初始化为0 。其实全局变量也具备这一属性,因为全局变量也存储在静态数据区 。在静态数据区,内存中所有的字节默认值都是0x00 , 某些时候这一特点可以减少程序员的工作量 。最后对static的三条作用做一句话总结 。首先static的最主要功能是隐藏,其次因为static变量存放在静态存储区,所以它具备持久性和默认值0 。下面是main.c的内容 除了头文件 , 需要声明函数:void msg(); int main(void) { extern char a; // extern variable must be declared before use printf("%c ", a); (void)msg(); return 0; }【c语言中static的作用,c语言中为什么要用static声明变量它的具体作用是什么请举例说明】
4,C语言中static是做什么用的最主要有两点用途 。1. 让一个变量长期有效,而不管其是在什么地方被申明 。比如:int fun1()static int s_value = http://www.lisdn.com/mnsj/hhzs/0;....}那么fun1不管在什么地方被调用,当函数退出后 , s_value最后的值将一直会被系统保存(相当于一个全局变量) , 下次s_value再被用到时,也即当fun1()再次被调用时,s_value初始值将是最近被保存过的值(请注意s_value初始化操作只会被执行一次 , 即上述s_value =0 这个语句) 。2.避免多个文件使用了相同的变量名而导致冲突 比如有多个文件,分别由几个人独立开发的 。假定他们在各自的文件中定义相同的“全局”变量名(仅仅指在他们独自的文件中全局),当系统集成时,由于他们使用了名字一样的“全局”变量,导致有难于遇见的问题 。解决这个问题方便的做法就是在各自文件中,在相同的全局变量申明前加上static修饰符 。这样系统就会为他们分配不同的内存,互不影响了 。在C语言中,static的作用有三个,分别如下:1、隐藏;当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性 。2、保持变量内容的持久;存储在静态数据区的变量会在程序刚开始运行时就完成初 始化,也是唯一的一次初始化 。3、默认初始化为0;在静态数据区,内存中所有的字节默认值都是0x00,某些 时候这一特点可以减少程序员的工作量 。这个应该是个静态存储,在一次循环之后,带入的值是不会被释放的,也就是说第一次循环结果是多少第二次循环还是多少,不会变成题目初始值 。static和extern定义的变量都是在静态存储区分配存储单元的 。在C语言中可以同时建立多个文件,可将不让其他文件引用的本文件中的全局变量都加上static , 成为静态全局变量,对其他文件屏蔽起来,而extern的功能刚好相反 。详细的功能可以参考c课本的作用域与存储类型 。c语言是一种计算机程序设计语言 。它既有高级语言的特点,又具有汇编语言的特点 。它可以作为系统设计语言 , 编写工作系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序 。因此 , 它的应用范围广泛 。c语言对操作系统和系统使用程序以及需要对硬件进行操作的场合,用c语言明显优于其它解释型高级语言 , 有一些大型应用软件也是用c语言编写的 。c语言具有绘图能力强,可移植性,并具备很强的数据处理能力,因此适于编写系统软件,三维,二维图形和动画 。它是数值计算的高级语言 。5,C里static的作用是什么要理解static,就必须要先理解另一个与之相对的关键字 , 很多人可能都还不知道有这个关键字,那就是auto , 其实我们通常声明的不用static修饰的变量,都是auto的,因为它是默认的,就象short和long总是默认为int一样;我们通常声明一个变量:inta;strings;其实就是:autointa;autostrings;而static变量的声明是:staticinta;staticstrings;这样似乎可以更有利于理解auto和static是一对成对的关键字吧,就像private,protected , public一样;对于static的不理解,其实就是对于auto的不理解,因为它是更一般的;有的东西你天天在用,但未必就代表你真正了解它;auto的含义是由程序自动控制变量的生存周期,通常指的就是变量在进入其作用域的时候被分配,离开其作用域的时候被释放;而static就是不auto,变量在程序初始化时被分配 , 直到程序退出前才被释放;也就是static是按照程序的生命周期来分配释放变量的,而不是变量自己的生命周期;所以 , 像这样的例子:voidfunc()inta;staticintb;}每一次调用该函数,变量a都是新的,因为它是在进入函数体的时候被分配,退出函数体的时候被释放,所以多个线程调用该函数,都会拥有各自独立的变量a,因为它总是要被重新分配的;而变量b不管你是否使用该函数,在程序初始化时就被分配的了,或者在第一次执行到它的声明的时候分配(不同的编译器可能不同),所以多个线程调用该函数的时候,总是访问同一个变量b,这也是在多线程编程中必须注意的!static的全部用法:1.类的静态成员:classaprivate:staticints_value;};在cpp中必须对它进行初始化:inta::s_value=0;//注意,这里没有static的修饰!类的静态成员是该类所有实例的共用成员 , 也就是在该类的范畴内是个全局变量,也可以理解为是一个名为a::s_value的全局变量,只不过它是带有类安全属性的;道理很简单,因为它是在程序初始化的时候分配的,所以只分配一次 , 所以就是共用的;类的静态成员必须初始化,道理也是一样的 , 因为它是在程序初始化的时候分配的,所以必须有初始化,类中只是声明,在cpp中才是初始化,你可以在初始化的代码上放个断点,在程序执行main的第一条语句之前就会先走到那;如果你的静态成员是个类,那么就会调用到它的构造函数;2.类的静态函数:classaprivate:staticvoidfunc(intvalue);};实现的时候也不需要static的修饰,因为static是声明性关键字;类的静态函数是在该类的范畴内的全局函数,不能访问类的私有成员 , 只能访问类的静态成员,不需要类的实例即可调用;实际上 , 它就是增加了类的访问权限的全局函数:voida::func(int);静态成员函数可以继承和覆盖,但无法是虚函数;3.只在cpp内有效的全局变量:在cpp文件的全局范围内声明:staticintg_value=0;这个变量的含义是在该cpp内有效,但是其他的cpp文件不能访问这个变量;如果有两个cpp文件声明了同名的全局静态变量 , 那么他们实际上是独立的两个变量;如果不使用static声明全局变量:intg_value=0;那么将无法保证这个变量不被别的cpp共享,也无法保证一定能被别的cpp共享,因为要让多个cpp共享一个全局变量,应将它声明为extern(外部)的;也有可能编译会报告变量被重复定义;总之不建议这样的写法,不明确这个全局变量的用法;如果在一个头文件中声明:staticintg_vaule=0;那么会为每个包含该头文件的cpp都创建一个全局变量 , 但他们都是独立的;所以也不建议这样的写法,一样不明确需要怎样使用这个变量 , 因为只是创建了一组同名而不同作用域的变量;这里顺便说一下如何声明所有cpp可共享的全局变量,在头文件里声明为extern的:externintg_value;//注意,不要初始化值!然后在其中任何一个包含该头文件的cpp中初始化(一次)就好:intg_value=0;//初始化一样不要extern修饰,因为extern也是声明性关键字;然后所有包含该头文件的cpp文件都可以用g_value这个名字访问相同的一个变量;4.只在cpp内有效的全局函数:在cpp内声明:staticvoidfunc();函数的实现不需要static修饰,那么这个函数只可在本cpp内使用,不会同其他cpp中的同名函数引起冲突;道理和如果不使用static会引起的问题和第3点一样;不要在头文件中声明static的全局函数 , 不要在cpp内声明非static的全局函数,如果你要在多个cpp中复用该函数,就把它的声明提到头文件里去 , 否则在cpp内部声明需要加上static修饰;在c语言中这点由为重要!另外:前一阵子在一段程序中用到了关键字static,就是静态类成员,当时的情况是所有对象都需要访问一个全局对象,所以自然就想到了静态数据成员,静态数据成员被当作该类的全局对象 , 它对每个类类型只有一份拷贝 , 该类所有对象共享访问 。那么它同全局变量相比有什么优势呢?一是静态数据成员不会与程序中的其他全局名字冲突,因为它在类中包含着 。二是静态数据成员可以实现数据隐藏 , 它可以是private成员 。需要注意的是静态数据成员需要在类外进行初始化,但整形的const静态数据成员可以在类中用常量初始化 。如我们定义一个类a:classa........private:staticdouble_a;staticconstint_b=10;//对整形的const静态数据成员初始化};那么我们对它的样子就应该是这样:doublea::_a=0;constintstatic_b;//但它必须在类体之外进行定义希望对你有帮助!static是静态,表示这个变量什么的生存期是从程序开始到程序结束const只是表示并强制某个东西不会被改变static是静态变量,就是变量值不随函数执行结束而消失,下次调用同一函数时 , 上次所赋予的值仍存在 。const是常量,是不可改变的

    推荐阅读