专业汉语词典知识平台,分享汉字词语知识、历史文学知识解答!

励北网
励北网

c语言static作用是什么,c语言static作用详解

来源:小易整编  作者:小易  发布时间:2023-03-20 03:03
摘要:c语言static作用是什么,c语言static作用详解static的作用还是比较强大的。对static关键字深入了解,首先需要掌握标准C程序的组成。 标准C程序一直由下列部分组成:1)正文段:CPU执行的机器指令部分,也就是你的程序。一个...

c语言static作用是什么,c语言static作用详解

c语言static作用是什么,c语言static作用详解

static的作用还是比较强大的。对static关键字深入了解,首先需要掌握标准C程序的组成。 

标准C程序一直由下列部分组成:

1)正文段:CPU执行的机器指令部分,也就是你的程序。一个程序只有一个副本;只 读,这是为了防止程序由于意外事故而修改自身指令;

2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这里。 

3)非初始化数据段(bss段)——在程序中没有初始化的全局变量;内核将此段初始化为0。注意:只有全局变量被分配到数据段中。 

4)栈——增长方向:自顶向下增长;自动变量以及每次函数调用时所需要保存的信息(返回地址;环境信息)。这句很关键,常常有笔试题会问到什么东西放到栈里面就足以说明。 

5)堆——动态存储分配。 

在嵌入式C语言当中,它有三个作用:

作用一:在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。

这样定义的变量称为局部静态变量:在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。也就是上面的作用一中提到的在函数体内定义的变量。除了类型符外,若不加其它关键字修饰,默认都是局部变量。比如以下代码:

1 void test1(void)
2 {
3    unsigned char a;
4     static unsigned char b;
5     ;
6     ;
7     ;
8     a+; b++;
9}

在这个例子中,变量a是局部变量,变量b为局部静态变量。作用一说明了局部静态变量b的 特性:在函数体,一个被声明为静态的变量(也就是局部静态变量)在这一函数被调用过程 中维持其值不变。这句话什么意思呢?若是连续两次调用上面的函数:

1test1:
2 void main(void) 
3{ … 
4test1();
5 test1();
6 … 
7}

然后使程序暂停下来,读取a和b的值,你会发现,a=1,b=2。怎么回事呢,每次调用test1 函数,局部变量a都会重新初始化为0x00;然后执行a++;而局部静态变量在调用过程中却能 维持其值不变。

通常利用这个特性可以统计一个函数被调用的次数。 声明函数的一个局部变量,并设为static类型,作为一个计数器,这样函数每次被调用的时 候就可以进行计数。这是统计函数被调用次数的最好的办法,因为这个变量是和函数息息相 关的,而函数可能在多个不同的地方被调用,所以从调用者的角度来统计比较困难。代码如 :

 1 void count(); int main()
 2 {
 3    int i; for (i = 1; i <= 3; i++)
 4    { count();
 5     {
 6        return 0;
 7     }
 8    }
 9
10 }
11
12void count()
13{
14    static num = 0;
15    num++;
16    printf(" I have been called %d",num,"times\n");
17}

输出结果为:I have been called 1 times. I have been called 2 times. I have been called 3 times. 

看一下局部静态变量的详细特性,注意它的作用域。

1)内存中的位置:静态存储区 

2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,

除非他被显示初始化) 

3)作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随

之结束。 

注:当static用来修饰局部变量的时候,它就改变了局部变量的存储位置,从原来的栈中 存放改为静态存储区。但是局部静态变量在离开作用域之后,并没有被销毁,而是仍然驻留 在内存当中,直到程序结束,只不过我们不能再对他进行访问。 

作用二:在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函 数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。 

这样定义的变量也称为全局静态变量:在全局变量之前加上关键字static,全局变量就 被定义成为一个全局静态变量。也就是上述作用二中提到的在模块内(但在函数体外)声明 的静态变量。

定义全局静态变量的好处:

<1>不会被其他文件所访问,修改,是一个本地的局部变量。

<2>其他文件中可以使用相同名字的变量,不会发生冲突。

全局变量的详细特性,注意作用域,可以和局部静态变量相比较:

1)内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在)

2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意

的,除非他被显示初始化) 

3)作用域:全局静态变量在声明他的文件之外是不可见的。准确地讲从定义之处开始到

文件结尾。

当static用来修饰全局变量的时候,它就改变了全局变量的作用域(在声明他的文件之外是 不可见的),但是没有改变它的存放位置,还是在静态存储区中。 作用三:在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那 就是,这个函数被限制在声明它的模块的本地范围内使用。 

这样定义的函数也成为静态函数:在函数的返回类型前加上关键字static,函数就被定 义成为静态函数。函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文 件当中可见,不能被其他文件所用。

定义静态函数的好处:

<1> 其他文件中可以定义相同名字的函数,不会发生冲突 

<2> 静态函数不能被其他文件所用。它定义一个本地的函数。

这里我一直强调数据和函数的本地化,这对于程序的结构甚至优化都有巨大的好处,更 大的作用是,本地化的数据和函数能给人传递很多有用的信息,能约束数据和函数的作用范 围。在C++的对象和类中非常注重的私有和公共数据/函数其实就是本地和全局数据/函数的 扩展,这也从侧面反应了本地化数据/函数的优势。

最后说一下存储说明符,在标准C语言中,存储说明符有以下几类:auto、register、extern和static 对应两种存储期:自动存储期和静态存储期。auto和register对应自动存储期。具有自动存储期的变量在进入声明该变量的程序块时被建 立,它在该程序块活动时存在,退出该程序块时撤销。关键字extern和static用来说明具有静态存储期的变量和函数。用static声明的局部变量具 有静态存储持续期(static storage duration),或静态范围(static extent)。虽然他 的值在函数调用之间保持有效,但是其名字的可视性仍限制在其局部域内。静态局部对象在 程序执行到该对象的声明处时被首次初始化。


本文地址:百科问答频道 https://www.neebe.cn/wenda/933224.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!


百科问答
小编:小易整编
相关文章相关阅读
  • C语言while语句的用法

    C语言while语句的用法

    while语句的一般形式为:while(表达式)语句其中表达式是循环条件,语句为循环体。#includeintmain(void){inti,sum=0;i=1;while(i...

  • c语言移位运算符怎么用,c语言移位操作

    c语言移位运算符怎么用,c语言移位操作

    c语言移位运算符怎么用,c语言移位操作C的移位位运算符。移位运算符向左或向右移动位。1.左移:<<左移运算符(<<)将其左侧运算对象每一位的值向左移动其右侧运算对象指定的位数。左侧运算对象移出左末端位的值丢失,用0填充空出的位置.下面例子中...

  • while循环用法,C语言中while循环用法

    while循环用法,C语言中while循环用法

    while循环用法,C语言中while循环用法-While循环1、While循环结构与for循环不同,While循环没有初始化和更新部分的for循环,它只有测试条件和循环体;while(test-condition) body2、类型别名...

  • strcpy函数怎么用,C语言strcpy函数的使用

    strcpy函数怎么用,C语言strcpy函数的使用

    strcpy函数怎么用,C语言strcpy函数的使用strcpy简单使用: #include#includestructStudent{ intsid; charname[20]; intage;}st; //此处分号不可省略intmain...

  • scanf在C语言中的作用,scanf函数用法

    scanf在C语言中的作用,scanf函数用法

    scanf在C语言中的作用,scanf函数用法如果你想让自己的输入更加炫酷、更加个性化、更加安全,那么还需要学习scanf()的高级用法,这才是大神和菜鸟的分水岭。好了,言归正传,我们分三个方面讲解scanf()的高级用法。1)指定读取长度...

  • sscanf函数用法,C语言中sscanf函数6种用法详解

    sscanf函数用法,C语言中sscanf函数6种用法详解

    sscanf函数用法,C语言中sscanf函数6种用法详解sscanf()函数实现:不管接触过任何编程语言也好,学过正则表达式的都对sscanf()的使用并不陌生了。如何通过sscanf将已知的字符串通过格式化匹配出有效的信息?下面我把要实...

  • strcat函数怎么用,C语言strcat函数用法

    strcat函数怎么用,C语言strcat函数用法

    strcat函数怎么用,C语言strcat函数用法strcat()是追加字符串的函数。strcat(char[]a,char[]b)即将第二个字符串追加到第一个字符串末尾,第二个字符串值不变,第一个变长。追加时需要保证第一个字符串在加上第二...

  • while语句怎么用,C语言while语句用法

    while语句怎么用,C语言while语句用法

    while语句怎么用,C语言while语句用法一、语句格式:while(条件表达式) 语句1;while(条件表达式) { 语句1; 语句2; 语句3; 语句…; }二、与for循环的比较:一般的,对于可以确定循环次数的问题,我们采...

  • 周排行
  • 月排行
  • 年排行

精彩推荐