C语言中static关键字用法

C语言中static关键字用法

2021年7月28日·席锦

static关键字在c语言中比较常用,使用恰当能够大大提高程序的模块化特性,有利于扩展和维护。但是对于c语言初学者,static由于使用灵活,并不容易掌握。

变量

1.局部变量

普通局部变量是再熟悉不过的变量了,在任何一个函数内部定义的变量(不加static修饰符)都属于这个范畴。编译器一般不对普通局部变量进行初始化,也就是说它的值在初始时是不确定的,除非对其显式赋值。

静态局部变量使用static修饰符定义,即使在声明时未赋初值,编译器也会把它初始化为0。

实例程序:

#include <stdio.h>int main(void)
{int a, b;static int c, d;_asm int 3        // 中断,在调试模式下查看a,b,c,d的值。可以看到a,b的值与c,d的值不同printf("%d, %d", c, d);        // 不加这一句无法在中断时查看到c,d的值。注意a,b未初始化不能使用return 0;
}

F5调试信息:

普通局部变量存储于进程栈空间,使用完毕会立即释放。

静态局部变量存储于进程的全局数据区,即使函数返回,它的值也会保持不变;但是其作用域为局部作用域,当定义它的函数结束时,其作用域随之结束。

实例程序:

#include <stdio.h>
void fun(void)
{int n_1 = 10;printf("n=%d\n", n_1);n_1++;printf("n++=%d\n", n_1);
}
void fun_static(void)
{static int n_2 = 10;printf("static n=%d\n", n_2);n_2++;printf("n++=%d\n", n_2);
}
int main(void)
{// 普通局部变量,使用完毕会立即释放fun();printf("\n");fun();printf("--------------------\n");// 静态局部变量即使函数返回,它的值也会保持不变fun_static();printf("\n");fun_static();//printf("static n=%d\n", n_2);    // 打开本行语句编译就无法通过,因为变量n_2的作用域仅在fun_static()函数内return 0;
}

运行截图:

2.全局变量

全局变量定义在函数体外部,在全局数据区分配存储空间,且编译器会自动对其初始化。

普通全局变量对整个工程可见,其他文件可以使用extern外部声明后直接使用。也就是说其他文件不能再定义一个与其相同名字的变量了(否则编译器会认为它们是同一个变量)。

静态全局变量仅对当前文件可见,其他文件不可访问,其他文件可以定义与其同名的变量,两者互不影响。

在定义不需要与其他文件共享的全局变量时,加上static关键字能够有效地降低程序模块之间的耦合,避免不同文件同名变量的冲突,且不会误使用。

实例程序:

/* demo.h */
#include <stdio.h>/* demo.c */
#include "demo.h"static int itest;        // 在demo2.c中也有一个一模一样的定义,但是程序编译运行正常
extern int itest2;        // 若是去掉extern将编译失败int main(void)
{printf("hello world.\n");return 0;
}/* demo2.c */
#include "demo.h"static int itest;
int itest2;

运行截图:

函数

函数的使用方式与全局变量类似,在函数的返回类型前加上static,就是静态函数。其特性如下:

1)静态函数只能在声明或定义它的文件中可见,其他文件不能引用该函数

2)不同的文件可以使用相同名字的静态函数,互不影响

非静态函数可以在另一个文件中直接引用,甚至不必使用extern声明

实例程序:

/* demo.h */
#include <stdio.h>
static void fun1(void);
static void fun2(void);
void callFun2(void);/* demo.c */
#include "demo.h"static void fun1(void)
{printf("hello from demo fun1.\n");
}int main(void)
{fun1();    // 静态函数,定义在本文件中,可以直接调用//fun2();    // 打开注释,将无法编译通过。原因:函数fun2()是静态函数,且不在本文件中声明或定义callFun2();    // 非静态函数可以在另一个文件中直接引用return 0;
}/* demo2.c */
#include "demo.h"
static void fun2(void)
{printf("hello from demo fun2.\n");
}void callFun2(void)
{fun2();    // 静态函数,定义在本文件中,可以直接调用
}

运行截图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/139016.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实验2.1.3 交换机的远程配置

实验2.1.3 交换机的远程配置 一、任务描述二、任务分析三、实验拓扑四、具体要求五、任务实施&#xff08;一&#xff09; password认证1. 进入系统视图重命名交换机的名称为SWA2. 关闭干扰信息3. 设置vty为0-44. 设置认证方式为password5. 设置登录密码为&#xff1a;huawei6.…

[机缘参悟-110] :一个IT人对面具的理解:职业面具戴久了,就会忘记原本真实的自己,一个人是忠于职位,还是忠于内心?

目录 一、职业面具戴久了&#xff0c;就会忘记原本真实的自己 二、霸王别姬 三、没有对错&#xff0c;各走各路 3.1 程蝶衣&#xff1a;戏里戏外&#xff0c;忠于角色 3.2 段小楼&#xff1a;戏里戏外&#xff0c;角色分明 3.3 没有对错&#xff0c;各走各路 四、职场中…

【Linux学习笔记】下载工具yum

1. yum工具1.1. yum的安装1.2. yum的搜索1.3. yum的卸载 2. Linux和Windows互相传输文件2.1. rz命令2.2. sz命令 3. yum的下载源 1. yum工具 yum是Linux软件包的管理器&#xff0c;是一个软件。那么软件的本质是什么呢&#xff1f; 答案是指令&#xff01; 下面举几个简单的例…

el-table :span-method合并单元格

<el-table :data"tableData" :span-method"objectSpanMethod" border style"width: 100%" :height"300"><el-table-column type"index" label"序号" width"50"></el-table-column>&l…

C语言进行实验:通过程序实现线算图取值【支持VC++ 6.0编辑器环境运行】

背景&#xff1a; 一、实验目的和要求 1、能描述数据基本类型及其常量的表示方法&#xff1b; 2、会对变量进行定义及初始化&#xff1b; 3、能使用运算符与表达式对变量赋值&#xff1b; 4、会描述C语句的概念及种类、C语言常用的输入/出方式&#xff1b; 5、会设计顺序…

SpringCloud 完整版--(Spring Cloud Netflix 体系)

目录 SpringCloudSpring Cloud Netflix 体系分布式概念&#xff1a;分析图单体应用分布式架构集群微服务分布式微服务集群 服务注册与发现Eureka作用&#xff1a;为什么使用Eureka&#xff1f;解答&#xff1a;分析图 搭建&#xff1a;1、注册中心Eureka-server搭建创建项目配置…

电子电器架构——基于Adaptive AUTOSAR的电子电器架构简析

基于Adaptive AUTOSAR的电子电器架构简析 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明…

[架构之路-240]:目标系统 - 纵向分层 - 应用层 - 应用层协议与业务应用程序的多样化,与大自然生物的丰富多彩,异曲同工

目录 前言&#xff1a; - 倒金子塔结构 - 大自然的组成 一、应用层在计算机系统中的位置 1.1 计算机应用程序的位置 1.1.1 业务应用程序概述 1.1.2 应用程序的分类 - 按照计算机作用范围 1.1.3 业务应用程序分类 - 按照行业分类 1.2 网络应用协议的位置 1.2.1 网络协…

Python学习基础笔记六十九——文本2

二进制&#xff08;字节&#xff09;模式&#xff1a; 文本文件&#xff0c;纯文本文件就是保存文本字符串的文件&#xff0c;跟word还不一样&#xff0c;word是富文本文件。 其实就文件存储的底层来说&#xff0c;不管什么类型的文件&#xff08;文本、视频、图片、word、Ex…

Ubuntu:VS Code IDE安装ESP-IDF【保姆级】

物联网开发学习笔记——目录索引 Visual Studio Code&#xff08;简称“VS Code”&#xff09;是Microsoft向开发者们提供的一款真正的跨平台编辑器。 参考&#xff1a; VS Code官网&#xff1a;Visual Studio Code - Code Editing. Redefined 乐鑫官网&#xff1a;ESP-IDF…

c#设计模式-行为型模式 之 解释器模式

&#x1f680;简介 给定一个语言&#xff0c;定义它的文法表示&#xff0c;并定义一个解释器&#xff0c;这个解释器使用该标识来解释语言中的 句子。 解释器模式包含以下主要角色 抽象表达式&#xff08;Abstract Expression&#xff09;角色&#xff1a;定义解释器的接口&…

Unity之ShaderGraph如何实现边缘光效果

前言 游戏中最常用的一个效果就是边缘光了&#xff0c;既可以做物体的高亮效果&#xff0c;也可以给人物皮肤表面添加光泽。如下图所示&#xff1a; 实现原理 边缘光的原理就是Fresnel节点的底层逻辑。 Fresnel&#xff1a;菲涅尔效应是根据视角不同表面上反射率不同的效应…