x*在c语言中是什么意思static修饰的函数和普通函数的区别

static变量、static函数与普通变量、普通函数的区别
全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式,
静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,
当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域,
即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,
因此可以避免在其它源文件中引起错误。static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;static函数与普通函数有什么区别: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,函数就被定义成为静态函数。&&函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。定义静态函数的好处:&1&&其他文件中可以定义相同名字的函数,不会发生冲突&2&&静态函数不能被其他文件所用。&存储说明符auto,register,extern,static,对应两种存储期:自动存储期和静态存储期。&auto和register对应自动存储期。具有自动存储期的变量在进入声明该变量的程序块时被建立,它在该程序块活动时存在,退出该程序块时撤销。关键字extern和static用来说明具有静态存储期的变量和函数。用static声明的局部变量具有静态存储持续期(static&storage&duration),或静态范围(static&extent)。虽然他的值在函数调用之间保持有效,但是其名字的可视性仍限制在其局部域内。静态局部对象在程序执行到该对象的声明处时被首次初始化。由于static变量的以上特性,可实现一些特定功能。1.&统计次数功能声明函数的一个局部变量,并设为static类型,作为一个计数器,这样函数每次被调用的时候就可以进行计数。这是统计函数被调用次数的最好的办法,因为这个变量是和函数息息相关的,而函数可能在多个不同的地方被调用,所以从调用者的角度来统计比较困难。C语言中使用静态函数的好处:静态函数会被自动分配在一个一直使用的存储区,直到退出应用程序实例,避免了调用函数时压栈出栈,速度快很多。&关键字“static”,译成中文就是“静态的”,所以内部函数又称静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件。 使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为同名也没有关系。&c语言中static的语义1.static变量:1).局部a.静态局部变量在函数内定义,生存期为整个源程序,但作用域与自动变量相同,只能在定义该变量的函数内使用。退出该函数后, 尽管该变量还继续存在,但不能使用它。b.对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。2).全局全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。但是他们的作用域,非静态全局 变量的作用域是整个源程序(多个源文件可以共同使用); 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。2.static函数(也叫内部函数)只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用。区别于一般的非静态函数(外部函数) static在c里面可以用来修饰变量,也可以用来修饰函数。 先看用来修饰变量的时候。变量在c里面可分为存在全局数据区、栈和堆里。其实我们平时所说的堆栈是栈而不包含对,不要弄混。
static修饰的函数作用与意义
函数是否应该设置为static
java回顾篇——static和非static的区别
C语言的一个关键字——static
static用法小结
C语言中的static 详细分析
[程序员面试题]C/C++中static的作用
static在C和C++中的用法和区别
浅谈static ,final 关键字的作用
没有更多推荐了,博客访问: 68990
博文数量: 43
博客积分: 0
博客等级: 民兵
技术积分: 376
注册时间:
分类: C/C++ 16:31:45
函数中加“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件。 使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为同名也没有关系。
根本原因是C语言中同一个工程中不能有同名函数
定义静态函数的好处:
&其他文件中可以定义相同名字的函数,不会发生冲突
&静态函数不能被其他文件所用。
关于内联函数
内联函数是在函数的前面加“inline”意思是这个函数要插到程序中,让编译器不用函数名跳转的方式来实现(原因是这样跳来跳去比较花费时间)而是直接插在运行的地方变成二进制文件,将来运行到这个地方直接运行类似于宏代替,不好的地方就是这种函数一般用得比较频繁,所以可能很多地方都要占用空间,而不是跳过去执行只需要一个地方有这段代码就行,所以书面的说我们是“空间”替换了“时间”
关于内联函数必须加static的问题
内联函数一般都写成static inline原因是内联函数一般写在.h文件中,这个文件的原则其实是不写函数而只写函数名,现在写了函数了很多.c文件可能都会包含这个.h文件如果不写static,编译的时候就会在linking过程中编译不过,其实意思就是同一个工程中不能有相同的文件名
阅读(880) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
请登录后评论。以下试题来自:
填空题用static修饰的方法,称为静态方法。它们不是对象的方法,而是整个类的方法。静态方法只能处理用关键字 ______ 修饰的数据。 static
为您推荐的考试题库
你可能感兴趣的试题
1.填空题 容错功能2.填空题 实体3.填空题 TCP/IP4.填空题 字节代码指令5.填空题 9x
热门相关试卷
最新相关试卷&&&&&&&&&&&
在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。
(1)先来介绍它的第一条也是最重要的一条:隐藏。
当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。
下面是a.c的内容
char&a&=&'A';&//&global&variablevoid&msg()&{&&&&printf("Hello\n");&}
&下面是的内容
int&main(void){&&&&&&&&extern&char&a;&&&&//&extern&variable&must&be&declared&before&use&&&&printf("%c&",&a);&&&&(void)msg();&&&&return&0;}
程序的运行结果是:
你可能会问:为什么在a.c中定义的全局变量a和函数msg能在main.c中使用?前面说过,所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。此例中,a是全局变量,msg是函数,并且都没有加static前缀,因此对于另外的源文件main.c是可见的。
如果加了static,就会对其它源文件隐藏。例如在a和msg的定义前加上static,main.c就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。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());&&&&&&&&&&&&return&0;}
&程序的运行结果是:
global&&&&&&&&& local static
1&&&&&&&&&&&&&& 10
2&&&&&&&&&&&&&& 9
3&&&&&&&&&&&&&& 8
4&&&&&&&&&&&&&& 7
5&&&&&&&&&&&&&& 6
6&&&&&&&&&&&&&& 5
7&&&&&&&&&&&&&& 4
8&&&&&&&&& &&&&&3
9&&&&&&&&&&&&&& 2
10&&&&&&&&&&&&& 1
3static00x00000&\0&&\0&
#include&&stdio.h&int&a;int&main(void){&&&&int&i;&&&&static&char&str[10];&&&&printf("integer:&%d;&&string:&(begin)%s(end)",&a,&str);&&&&return&0;}
程序的运行结果如下
integer: 0;&string: (begin)(end)
staticstaticstatic0。
以上内容出自博客园Mr. Write之手,写的相当清晰易懂,存档方便复习。原文地址:
下面是中兴通讯2012校招笔试题的一道问答题:
1. static全局变量与普通的全局变量有什么区别 ?
  全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。
  全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。
  这两者的区别在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。&
  static全局变量只初使化一次,防止在其他文件单元中被引用;& &
2.& static局部变量和普通局部变量有什么区别 ?
&  把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。&&
  static局部变量只被初始化一次,下一次依据上一次结果值;& &
3.& static函数与普通函数有什么区别?
  &static函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static修饰的函数),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件.
  static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
阅读(...) 评论()C语言中static的作用及C语言中使用静态函数有何好处
转载 &更新时间:日 15:10:32 & 投稿:mrr
在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语言中的static 详细分析 的文章

 

随机推荐