首页 > 其他分享 >学C笔记归纳 第四篇——static关键字(重点)

学C笔记归纳 第四篇——static关键字(重点)

时间:2023-12-04 11:34:25浏览次数:34  
标签:变量 作用域 局部变量 关键字 static 修饰 第四篇 全局变量

C语言本身内置了关键字,并非自己创建,也不能自己创建。

static的功能:

static功能
修饰局部变量 转变储存位置,延长局部变量生命周期,也可以保持其值不变
修饰全局变量

将外部链接属性变为内部连接属性,使作用域变小,其他源文件(.c)就不能再使用这个全局变量了,增加程序安全性

模块内函数外,将其变成本地全局变量

修饰函数

将外部链接属性变为内部连接属性,使作用域变小

将此函数变为模块的静态函数,模块内其他函数无法调用

 

 

 

 

 

栈区 局部变量...
堆区 动态内存管理
静态区 静态变量、全局变量...

 

 

 

 

 

 

局部变量进入作用域创建,出作用域销毁,static修饰局部变量时,局部变量出作用域也不销毁,本质上static修饰局部变量时,改变了变量的存储位置,程序结束时,静态变量才销毁。

存储位置的改变,影响的是变量的生命周期。

 

#include <stdio.h>

int add()
{
    static int a = 1;//改变变量a的存储区域
    a++;
    printf("%d\n", a);
    return 0;
}

int main()
{
    int i = 0;
    while (i < 5)
    {
        add();
        i++;
    }
    add();
    return 0;
}

 先看不用static修饰:

 

用static修饰变量a:

 进入反汇编界面:

 

可以发现,该静态变量没有对应汇编语句。

那么试试将变量a直接定义为全局变量:

反汇编:

 

同样没有对应汇编语句。

前面已经说过static修饰局部变量时会改变局部变量的存储位置到静态区,全局变量也存储在这个位置,

那么static修饰局部变量是不是就相当于定义全局变量呢? 这个问题还不能下定论,留在此处,标记日后处理。

 

补充一个关键字extern,调用模块内其他文件定义的全局变量时需声明 ,

编译器工作时是扫描本页面代码,如果不声明此变量,编译器就会报错未定义此变量,所以跨文件调用需声明。

注意:跨文件调用函数不声明不会报错,有时会警告,所以最好声明

 

 

标签:变量,作用域,局部变量,关键字,static,修饰,第四篇,全局变量
From: https://www.cnblogs.com/xiaowanglong/p/17873260.html

相关文章

  • centos查看日志文件内容,包含某个关键字的前后5行日志内容
    简述centos查看日志的几种方法centos查看日志文件内容,包含某个关键字的前后5行日志内容前情提示系统:一说部分截图、链接等因过期、更换域名、MD语法等可能不显示,可联系反馈(备注好博文地址),谢谢❤带有#号、删除线、不操作、不执行字样的为提示或者备份bash,实际不执行如果无法下载......
  • 【PUSDN】centos查看日志文件内容,包含某个关键字的前后5行日志内容,centos查看日志的几
    简述centos查看日志的几种方法centos查看日志文件内容,包含某个关键字的前后5行日志内容前情提示系统:一说部分截图、链接等因过期、更换域名、MD语法等可能不显示,可联系反馈(备注好博文地址),谢谢❤带有#号、删除线、不操作、不执行字样的为提示或者备份bash,实际不执行如果无法下载......
  • Angular Component 内 set 关键字的使用
    "set"关键字在Angular组件的TypeScript代码中通常用于创建和定义类的属性的setter方法。它是一种特殊的方法,负责设置类的私有成员变量的值。通过使用"set"关键字,我们可以在设置属性值时执行一些额外的逻辑,如输入验证、触发事件等。让我们通过一个简单的例子来说明"set"关键字的......
  • 关键字 开发-09 validate断言
    1.yaml文件中添加validate进行接口断言首先我们在utils/validate.py文件添加需要的断言方式importredefequals(check_value,expect_value):assertcheck_value==expect_value,f'{check_value}=={expect_value}'defless_than(check_value,expect_value):......
  • 关键字 开发-08 extract提取返回的结果
    1.extract提取请求返回结果的返回值在进行接口自动化的时候,往往需要提取上一个接口返回的值,传递给下一个接口使用。创建utils/extract.pyimportjsonimportreimportjsonpathimportjmespathfromutilsimportexceptionsfromrequestsimportResponsedefextract_b......
  • instanceof关键字
    instanceof用于判断类型eg:catinstanceofAnimal判断该对象引用,是否是为该类型(自身类、自身类父类、Object)都是返回true,其他情况返回falseeg:strinstanceofString例子AnimalParent类publicclassAnimalParent{}Cat类publicclassCatextendsAnimalParent......
  • SQL 关键字执行顺序
    1.FromandJOIN首先我们进行查询的时候,肯定是先获得一份数据集的,From语句和JOIN被先执行的,就是为了获得数据集的。2.WHERE一旦数据集给拿到了,WHERE限制条件会被用到某些行上,并把不满足的行给抛弃掉。并且,这能够用到各种数据类型中3.GROUPBYWHERE条件限定之后,接下来就是GRO......
  • static变量注入
    对静态static变量注入值方式@Value("${videoPath}")privateStringpath;@Value("${videoPath}")privatestaticStringpath2;privatestaticStringpath3;@Value("${videoPath}")publicvoidsetPath3(Stringpath3......
  • C++ 11 关键字:thread_local
    thread_local是C++11新引入的一种存储类型,它会影响变量的存储周期。C++中有4种存储周期:automaticstaticdynamicthread有且只有thread_local关键字修饰的变量具有线程(thread)周期,这些变量在线程开始的时候被生成,在线程结束的时候被销毁,并且每一个线程都拥有一个独......
  • static、extern、inline 说明符和链接属性
    概述-Overview在我初学C++时,static、inline、extern可能是最令我迷惑的C++说明符,原因是它们在不同的语境下会发挥不同的作用,而且某些说明符的含义已经和以前不同,这加剧了我在查询资料时的困扰。所以今天决定好好总结一下。首先要介绍C++的两个概念:存储期和链接。存储......