静态局部变量又和静态全局变量又有何区别?

来源:5-11 变量存储类别

qq_小猪快跑_2

2015-07-10 14:25

static int x = 1;   //定义静态局部变量    x*=2;    printf("x=%d\n",x);     静态局部变量在编译时赋初值,即只赋初值一次;-->静态局部变量值可以变化吗? 如果可以变化,那么静态局部变量又和静态全局变量又有何区别?

写回答 关注

1回答

  • onemoo
    2015-07-11 23:40:15

    首先:C语言中的名字(标识符)具有很多属性:生存期、可链接性...等

    生存期分为:

    1. 静态生存期:在程序开始前就已经存在并初始化了,这个变量要的等整个程序都结束后才销毁。

    2. 动态生存期:就是程序流程运行到这个位置时才为这个变量分配内存,程序流程离开这个变量的作用域后就销毁了它。

    可链接性大致分为:

    1. 内部链接:这个变量可以在代码所在的文件中使用。

    2. 外部链接:这个变量在整个程序中(所有的文件中)都可以使用。

    3. 不可链接:这个变量只能在其代码块中被使用。常见的情况就是只能在其所在的函数中被使用。


    static修饰符对于局部变量和全局变量的意义是不一样的:

    局部变量默认具有 动态生存期不可链接 的属性。 局部变量是存在于函数中的,由于它具有动态生存期,故你每一次调用函数,其中的这个变量都是全新的一个。你存储于其中的值在函数调用结束后就不存在了,再次调用这个函数的得到的仍是全新一个变量。 但如果变量被static修饰,就成了静态局部变量,“静态”是指改变了其生存期,变成了静态生存期,那么多次调用这个函数所访问的就是同一个变量。这样你存入其中的值在下一次函数调用时仍然存在。

    全局变量默认具有 静态生存期外部链接 属性。 全局变量是存在于一个代码文件中,并且是任何一个函数之外的。它在整个程序运行期间都存在,并且外部链接性保证它可以被本程序的其他文件中的代码所使用。 而如果被static修饰,则链接性就变成内部链接了,那这个变量就只能被本文件中的代码使用了。对它来说static并不改变其生存期。


    你提问中说的“静态局部变量...只赋初值一次”说的就是你每一次调用函数其实都是用的同一个变量,而不是像普通局部变量一样在每次调用时都重新生成,重新初始化。

    所以明白了吗:静态局部变量的值当然是可以变化的,而且它可以让你在多次调用函数后保留存在其中的值。

    “静态”二字对于两种变量来说都不影响其值是否可以被改变,变量的值能否被改变是由 const限定符 决定的。


C语言入门

C语言入门视频教程,带你进入编程世界的必修课-C语言

926020 学习 · 20793 问题

查看课程

相似问题