static int x = 1; //定义静态局部变量 x*=2; printf("x=%d\n",x); 静态局部变量在编译时赋初值,即只赋初值一次;-->静态局部变量值可以变化吗? 如果可以变化,那么静态局部变量又和静态全局变量又有何区别?
首先:C语言中的名字(标识符)具有很多属性:生存期、可链接性...等
生存期分为:
静态生存期:在程序开始前就已经存在并初始化了,这个变量要的等整个程序都结束后才销毁。
动态生存期:就是程序流程运行到这个位置时才为这个变量分配内存,程序流程离开这个变量的作用域后就销毁了它。
可链接性大致分为:
内部链接:这个变量可以在代码所在的文件中使用。
外部链接:这个变量在整个程序中(所有的文件中)都可以使用。
不可链接:这个变量只能在其代码块中被使用。常见的情况就是只能在其所在的函数中被使用。
static修饰符对于局部变量和全局变量的意义是不一样的:
局部变量默认具有 动态生存期 和 不可链接 的属性。 局部变量是存在于函数中的,由于它具有动态生存期,故你每一次调用函数,其中的这个变量都是全新的一个。你存储于其中的值在函数调用结束后就不存在了,再次调用这个函数的得到的仍是全新一个变量。 但如果变量被static修饰,就成了静态局部变量,“静态”是指改变了其生存期,变成了静态生存期,那么多次调用这个函数所访问的就是同一个变量。这样你存入其中的值在下一次函数调用时仍然存在。
全局变量默认具有 静态生存期 和 外部链接 属性。 全局变量是存在于一个代码文件中,并且是任何一个函数之外的。它在整个程序运行期间都存在,并且外部链接性保证它可以被本程序的其他文件中的代码所使用。 而如果被static修饰,则链接性就变成内部链接了,那这个变量就只能被本文件中的代码使用了。对它来说static并不改变其生存期。
你提问中说的“静态局部变量...只赋初值一次”说的就是你每一次调用函数其实都是用的同一个变量,而不是像普通局部变量一样在每次调用时都重新生成,重新初始化。
所以明白了吗:静态局部变量的值当然是可以变化的,而且它可以让你在多次调用函数后保留存在其中的值。
“静态”二字对于两种变量来说都不影响其值是否可以被改变,变量的值能否被改变是由 const限定符 决定的。