C语言关键字之static

版权声明:本文为小生原创,转载请注明出处,好吗好的,善哉善哉!!! https://blog.csdn.net/u010650845/article/details/79627254

1. static关键字

当用于不同的上下文环境时,static 关键字具有不同的意思:

  • 静态全局变量
    static 关键字用于修改标识符的链接属性,从 external 改为 internal,但标识符的存储类型和作用域不受影响,本文件可见,其他文件可以定义同名变量

  • 静态局部变量
    static 关键字用于修改变量的存储类型,从自动变量修改为静态变量,但变量的链接属性和作用于不受影响,本函数可见,用这种方式声明的变量在程序执行之前创建(如未初始化,初始值为0),并在程序的整个执行期间一直存在,而不是每次在代码块开始执行时创建,在代码块执行完毕后销毁

  • 静态函数
    static 关键字用于修改标识符的链接属性,从 external 改为 internal,但标识符的存储类型和作用域不受影响,本文件可见,其他文件可以定义同名函数


1.1. 作用域存储类型实例

这里写图片描述

  • 01 行:a 的链接属性为 external,存储类型为静态,程序执行之前创建,初始化为 5,其他文件在使用变量 a 时,实际所访问的是该变量,作用域:01-12 行 And 17-29行

  • 02 行:如果 b 定义在其他地方,extern 关键字并非必须,但在风格上加上这个关键字为好,b 的链接属性为 external,存储类型为静态,程序执行之前创建,其他文件在使用变量 b 时,实际所访问的是该变量,作用域:02-06 行 And 25-29 行

  • 03 行:static 关键字修改了 c 的链接属性,从 external 修改为 internal,存储类型为静态,程序执行之前创建,默认初始值为 0,本文件可见,作用域:03-29 行

  • 04 行:声明两个标识符,d 的作用域从第 4 行到文件结束,函数 d 的定义对于这个源文件中任何以后想要调用它的函数而言起到了函数原型的作用,作为函数名 d 在缺省的情况下具有 external 的链接属性,所以其他源文件只要在文件上存在 d 的原型就可以调用 d,如果我们将 d 声明为 static,就可以把它的链接属性从 external 改为 internal,但这样做将使其他源文件不能访问这个函数,对于函数而言,存储类型并不是问题,因为代码总是存储于静态内存中
    参数 e 不具有链接属性所以我们只能从函数内部通过名字访问它,它具有自动存储类型,所以它在函数被调用时被创建,当函数返回时消失,由于与局部变量冲突,作用域:06-11 行 And 17-19 行 And 23-24 行

  • 06-08 行:声明局部变量,所以它们的作用域到函数结束为止,它们不具有链接属性,所以它们不能再函数的外部通过名字访问(这是它们成为局部变量的原因),f 的存储类型为自动,当函数每次被调用时,它通过隐式赋值被初始化为 15,b 的存储类型为寄存器类型,所以他的初始值是辣鸡,g 的存储类型是静态,所以它在程序的整个执行过程中一直存在,当程序开始执行时,它被初始化为 20,当函数每次被调用时,它并不会被重新初始化

  • 09 行: 声明并不需要,这个代码块位于第一行声明的作用域内

  • 12-13 行:声明局部变量,它们都具有自动存储类型,不具有链接属性,它们的作用域延伸至第 16 行,这些变量和之前声明的 a 和 e 不同,而且由于名字冲突,在这个代码块中以前声明的同名变量不能被访问

  • 14 行:使全局变量 h 在这个代码块内可以被访问,它具有 external 链接属性,存储于静态内存中,这是唯一一个必须使用 extern 关键字的生命,没有它,h 将变成一个局部变量

  • 19-20 行:创建局部变量( 自动,无链接属性,作用域限于本代码块),这个 e 和参数 e 是不同的变量,它和第 12 行声明的 e 也不相同,在这个代码块中,从第 11 行到第 18 行并无嵌套,所以编译器可以使用相同的内存来存储两个代码块中不同的 e 变量,如果你想让这两个代码块中的 e 表示同一个变量,那么你就不应该把它声明为局部变量

  • 25 行:声明函数 i,它具有静态链接属性,可以防止它被这个源文件之外的文件调用,事实上,其他的源文件也可以声明它自己的 i 函数,它与这个源文件的 i 是不同的函数,i 的作用域从它的声明位置直到这个源文件结束,函数 d 不可以调用函数 i,因为在 d 之前不存在 i 的原型

1.2. 总结

这里写图片描述

猜你喜欢

转载自blog.csdn.net/u010650845/article/details/79627254