首页 > 其他分享 >C语言之static关键字

C语言之static关键字

时间:2024-10-24 09:48:48浏览次数:1  
标签:存储 变量 作用域 代码 C语言 关键字 VS static

C语言之static和extern关键字

1.作用域

标识符可见的区域,访问和重名

由声明的位置所决定

1.1 代码块作用域 Block Scope

  • 花括号 {} 之内

  • 函数形参(不会为函数内同名变量所隐藏)

    ```C
    void myFunction(int x) {
      int x = 10;         // 这里的 x 不会隐藏形参 x
      printf("%d\n", x);  // 输出的仍然是形参 x 的值
    }
    ```
    

1.2 文件作用域 file Scope

所有代码块之外的标识符

自声明开始直到文件尾

  • 函数名
  • include展开可以扩展文件尾,本质上就是字符串替换

1.3 原型作用域 prototype Scope

仅适用于函数原型中声明的参数名,该参数名并非必要的

1.4 函数作用域 Function Scope

仅适用于语句标签,即goto语句

2.链接属性

决定如何处理不同文件中出现的标识符
2.1 None
没有链接属性,多个声明被认为是不同的独立实体
局部变量都是None
2.2 Internal 内部
同一个源文件中所有声明属于同一个实体,不同源文件声明属于不同实体
2.3 External 外部
无论声明多少次都表示同一个实体,即全局变量 Global
全局 VS 局部Local(仅仅是代码块中?)
文件作用域中的标识符默认都是External,增加该关键字具有更好的可读性

3.存储类型

决定变量的生命周期
变量的缺省存储类型取决于声明位置

  • 代码块之外,文件作用域
    • 静态变量 static
    • 静态内存中
    • 执行之前创建,在整个运行期间存在
    • 初始化默认值为0,显示初始化需要使用常量表达式,编译时求值
  • 代码块之内,代码块作用域
    • 自动变量 auto (局部变量 VS auto:static 修改存储类型)
    • 运行时堆栈
    • 执行时创建,退出代码块时销毁
    • 缺省值无效,显示初始化中除了使用const, 声明时初始化和先声明后赋值只有风格之差而无效率之别
  • register修饰的自动变量
    • 提示编译器存储在硬件寄存器中,不一定有效
    • 周期和自动变量一样,不使用地址

4.辨析

全局变量 VS 局部变量

  • 作用域:代码块的内部 VS 外部 (核心区别)
  • 链接属性:extern VS none
  • 存储类型:静态内存 VS 运行时堆栈

静态变量 VS 自动变量

  • 变量对象:
    • static修饰的局部变量(狭义)和全局变量(本质)
    • 自动变量:无static修饰的局部变量
  • 存储位置:
    • 静态变量存储在静态存储区
    • 自动变量存储在栈区
  • 生命周期:
    • 静态变量的生命周期是整个程序的运行期间,从程序开始执行到程序结束
    • 自动变量的生命周期是在其所在的代码块(如函数)被执行期间,当代码块执行结束就被销毁
  • 初始化:
    • 静态变量在编译时初始化,默认值为 0
    • 自动变量在运行时初始化,默认值是未定义的

局部变量缺省为自动类型

  • 运行时才分配存储空间
  • 在堆栈上方便实现递归

static不能修饰函数形参

  • 不改变None链接属性
  • 不可改变存储类型,参数通过堆栈传递

static和Extern关键字

  • 修改链接属性
    • static只对缺省为extern的标识符有效
      • 对 None类型不改变链接属性
    • extern 只对标识符的第一次声明有效

Static 不影响作用域

  • 代码块之外:链接属性改为 Internal
  • 代码块之内:存储类型改为静态内存

5.参考

  • 《C和指针》
    • 3.5 作用域
    • 3.6 链接属性
    • 3.7 存储类型
    • 3.8 static 关键字
    • 3.9 作用域、存储类型示例
  • 《嵌入式C语言的自我修养》
    • 5.3.5 栈和作用域
  • 《C程序设计语言》
    • 1.10 外部变量与作用域
    • 4.3 外部变量
    • 4.4 作用域规则
    • 4.6 静态变量
    • 4.7 寄存器变量
    • 4.8 程序块结构
    • 4.9 初始化

标签:存储,变量,作用域,代码,C语言,关键字,VS,static
From: https://www.cnblogs.com/libq8/p/18498914

相关文章

  • C语言之声明
    C语言之声明1.声明与定义声明语法说明符(说明类型或修改缺省属性)声明表达式列表说明符类型说明:int,float存储属性:static,auto类型限定:const,volatile声明VS定义说明类型:取值范围和合法操作定义:分配存储空间2.初始化显式初始化静态变量(含全局变量):使用常......
  • 实验三蕉 C语言函数应用编程蕉
    实验三蕉C语言函数应用编程蕉可恶,是原始博士!什么时候!?......
  • 20241022_095024 c语言 字符串的方法
    源始字符串strlen方法strcat方法strcpy方法strcmp方法大小写转换......
  • 20241022_105024 c语言 模拟用户登陆
    需求代码......
  • [数据结构] 删除单链表中最小值结点(C语言版本)
    如果对单链表基本操作或概念不理解的可以跳转:单链表的基本操作(C语言版)-CSDN博客https://blog.csdn.net/m0_74181956/article/details/143082621?spm=1001.2014.3001.5501算法思想:如图所示:定义指针p为L的第一个结点,pre为L的头结点,min为记录每次遍历的最小值结点,minpre为记......
  • 数据结构C语言版_队列笔记||已测试所有代码均可运行
    队列源文件使用markdown编写,CSDN文章发布好像有部分语法改变。每一部分我都有加一个返回标题好像不能使用了。但是CSDN自带一个目录总结,你们无视掉我写的目录直接用CSDN的吧。总结笔记不易,如果有帮助到你希望点个赞。所有代码均已在VScode中运行过,部分代码块因为格式原因......
  • C语言趣味编程100例源码分享
    C语言趣味编程100例是学习路上必不可缺的示例,话不多说直接看代码1,百钱百鸡问题include<stdio.h>main(){intcock,hen,chicken;for(cock=0;cock<=20;cock++) /外层循环控制公鸡数量取值范围0~20/for(hen=0;hen<=33;hen++) /内层循环控制母鸡数量取值范围0~30/for(chic......
  • C语言经典20例(输入数组元素,求出最大值和最小值,并输出)
    在c语言中,要实现要实现“输入数组元素,并求出最大值和最小值,并输出”主要步骤主要有以下几步:1.必要的头文件。2.定义数组大小。3.从用户那里接受数组元素的输入4.使用循环遍历数组。找出最大值和最小值5.输出最大值和最小值代码如下:#include<stdio.h>intmain(){......
  • C语言经典20例(二进制数转换为十进制数)
     #include<stdio.h>#include<string.h>//函数原型声明intbinaryToDecimal(constchar*binary);intmain(){charbinary[100];//声明一个字符数组,用于存储用户输入的二进制数,假设最大长度为99intdecimal;//用于存储转换后的十进制数//提示......
  • 明解c语言入门篇练习4-2do语句延伸
    明解c语言练习4-2我们可以看到题目:编写一段程序,像右面这样读取两个整数的值,然后计算出他们之间所有整数的和。上次我发了一段这个练习4-2的代码可以看一下#include<stdio.h>intmain(void){  inta,b,max,min;  intsum=0;  printf("请输入两个整数:......