昨天面试的公司第一道题就是问的static关键字,这是一个老生常谈的问题了,题目如下:
static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
稍微整理了一下笔记,可以简答:
Static修饰局部变量,局部变量所在的{}结束之后,局部变量本身并不会消亡,因为它存储在了静态存储区(全局变量也是在这),一般的局部变量则在栈上。Static修饰全局变量和修饰函数功能相近,全局变量和函数一般都可以别外部调用,但在static修饰后,将会将其限制在当前文件中,不能别外部调用,如被extern关键字调用。
综上所述,static关键字在c语言中有三个功能:1、隐藏。2、让变量更持久。3、默认初始化为0。(存放在静态存储区系统自动置0,可巧用在:当要把一个字符数组当字符串来用,但又每次要在字符数组末尾加’\0’很麻烦,这时把字符串定义成静态的。)
另外在网上看见别人对此总结得很好,也摘录下来以便复习:
下面是中兴通讯2012校招笔试题的一道问答题:
1. static全局变量与普通的全局变量有什么区别 ?
全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。
全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。
这两者的区别在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
static全局变量只初使化一次,防止在其他文件单元中被引用;
2. static局部变量和普通局部变量有什么区别 ?
把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。
static局部变量只被初始化一次,下一次依据上一次结果值;
3. static函数与普通函数有什么区别?
static函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static修饰的函数),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件.
static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。
转载于:https://www.cnblogs.com/Spider-spiders/p/8818971.html