【C语言】static关键字的使用

目录

一、静态本地变量

1.1 静态本地变量的定义

1.2 静态本地变量和非静态本地变量的区别

二、静态函数

2.1 静态函数的定义

2.2 静态函数与非静态函数的区别

三、静态全局变量

3.1 静态全局变量的定义

3.2 静态全局变量和非静态全局变量的区别

四、静态结构体变量 

4.1 静态结构体变量

4.2 静态结构体变量与非静态结构体变量

4.3 题外话


一、静态本地变量

1.1 静态本地变量的定义

静态本地变量是指在函数或方法内部定义的变量,在每次函数或方法被调用时都会保持其值的持久性。静态本地变量与普通本地变量的不同之处在于它们只会被初始化一次,并且在函数或方法的不同调用之间保持其值不变。

1.2 静态本地变量和非静态本地变量的区别

1.初始化

静态本地变量在没有显式初始化的情况下,默认会被设置为0。

非静态本地变量在没有显式初始化的情况下,其成员变量的值默认情况下是未定义的,即不会自动被赋值为0。

2.作用域(这里可以类比静态本地变量与非静态本地变量)

静态本地变量count1在每次函数调用之间保持其值。

非静态本地变量count2在每次函数调用时都是新创建的,其值不会保持一致。

#include <stdio.h>void counter() {static int count1; // 静态本地变量count1++;int count2=0; // 非静态本地变量count2++;printf("Count1: %d,", count1);printf("Count2: %d\n", count2);
}int main() {counter(); counter(); counter(); return 0;
}


二、静态函数

2.1 静态函数的定义

在函数声明前使用static关键字,将该函数声明为静态函数。静态函数只能在当前.c文件中使用,不能被其他.c文件中的函数调用。

#include <stdio.h>// 静态函数
static int add(int a, int b) {//静态函数return a + b;
}int main() {int num1 = 10;int num2 = 20;int sum = add(num1, num2);printf("Sum: %d\n", sum);return 0;
}

2.2 静态函数与非静态函数的区别

静态函数和非静态函数的区别?用言语和示例代码进行解释

 •静态函数和非静态函数在C语言中的区别主要体现在函数的作用域和可见性上。

  1. 静态函数的作用域限制在定义它的源文件内部,只能在同一个源文件内的其他函数中调用,不可以被其他源文件调用。非静态函数的作用域为整个程序,可以在该程序的任何地方调用。
  2. 静态函数的可见性仅限于定义它的源文件,其他源文件无法直接访问和调用该函数。非静态函数具有全局可见性,其他源文件可以通过函数声明来访问和调用该函数。

•静态函数和非静态函数,在同一个源文件内的其他函数中调用(正常运行)

#include<stdio.h>
static int staticFunc(int a, int b) {//静态函数return a + b;
}
int nonStaticFunc(int a, int b) {//非静态函数return a - b;
}int main() {int x = 10;int y = 5;int result1 = staticFunc(x, y);int result2 = nonStaticFunc(x, y);printf("Static Function Result: %d\n", result1);//Static Function Result: 15printf("Non-Static Function Result: %d\n", result2);//Non-Static Function Result: 5return 0;
}

•静态函数,被其他源文件调用(报错)

//static.c
#include<stdio.h>static int staticFunc(int a, int b) {return a + b;
}
//main.c
#include<stdio.h>static int staticFunc(int a, int b);int main() {int x = 10;int y = 5;int result1 = staticFunc(x, y);printf("Static Function Result: %d\n", result1);return 0;
}

•非静态函数,被其他源文件调用(正常运行)

//non_static.c
#include<stdio.h>int nonStaticFunc(int a, int b) {return a - b;
}
#include<stdio.h>int nonStaticFunc(int a, int b);int main() {int x = 10;int y = 5;int result2 = nonStaticFunc(x, y);printf("Non-Static Function Result: %d\n", result2);return 0;
}

三、静态全局变量

3.1 静态全局变量的定义

在函数外部使用static关键字声明的变量为静态全局变量,它们只能在当前文件中使用,其他文件无法访问。

#include <stdio.h>// 声明静态全局变量
static int count = 0;void func1() {count++;printf("func1: count = %d\n", count);
}
void func2() {count++;printf("func2: count = %d\n", count);
}int main() {// 调用函数1和函数2,观察静态全局变量的变化func1();//func1: count = 1func2();//func2: count = 2func1();//func1: count = 3return 0;
}

3.2 静态全局变量和非静态全局变量的区别

1.初始化

静态全局变量在程序的生命周期内只被初始化一次。如果没有显示初始化,静态全局变量默认初始化为0。

非静态全局变量在程序的生命周期内可以被多次初始化。如果没有显示初始化,非静态全局变量默认初始化为0。

2.作用域范围

静态全局变量的作用域仅限于声明的文件内,不同文件内的同名静态全局变量是互相独立的。

非静态全局变量的作用域是整个程序,可以在程序的任何地方访问。

3.文件间的访问性

静态全局变量只能在声明的文件内访问

非静态全局变量可以在其他文件中使用extern关键字进行声明并访问。(extern int i;)


四、静态结构体变量 

4.1 静态结构体变量

静态结构体变量是指在程序运行时在静态存储区分配的结构体变量。静态存储区是程序运行时分配给全局变量和静态变量的存储区域,其生命周期从程序开始执行到结束。静态结构体变量的定义方式与普通结构体变量相同,但需要使用static关键字来声明。

static struct Person p1;

4.2 静态结构体变量与非静态结构体变量

1.初始化

静态结构体变量在没有显式初始化的情况下,默认会被设置为0。

非静态结构体变量在没有显式初始化的情况下,其成员变量的值默认情况下是未定义的,即不会自动被赋值为0。

2.作用域(这里可以类比静态本地变量与非静态本地变量)

静态结构体变量s1在每次函数调用之间保持其值。

非静态结构体变量s2在每次函数调用时都是新创建的,其值不会保持一致。

#include <stdio.h>struct MyStruct {int value;
};void myFunction() {static struct MyStruct s1;// 静态结构体变量s1.value++;struct MyStruct s2 = { 0 };// 非静态结构体变量s2.value++;printf("s1.value = %d,", s1.value);printf("s2.value = %d\n", s2.value);
}int main() {myFunction();myFunction();myFunction();return 0;
}

4.3 题外话

 在进行AI查询过程中,由于“静态结构体成员变量”这个词走了点歪路,虽已更正,但仍做一小记:

1.C语言中,是不存在“静态结构体成员变量”的说法的。

2.区分结构体成员变量与结构体变量

#include <stdio.h>// 定义结构体
struct Person {char name[20];int age;
};int main() {// 声明一个结构体变量struct Person person;// 访问结构体的成员变量并赋值strcpy(person.name, "John");person.age = 25;// 打印结构体的成员变量printf("Name: %s\n", person.name);printf("Age: %d\n", person.age);return 0;
}

这个例子中,struct Person定义了一个名为Person的结构体,其中有两个成员变量nameage。在main函数中,我们声明了一个名为person的结构体变量,并使用.运算符来访问结构体的成员变量,并对其进行赋值。最后,我们使用printf函数打印出结构体的成员变量的值。 

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

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

相关文章

机器学习6-逻辑回归

逻辑回归是机器学习中一种常用于二分类问题的监督学习算法。虽然名字中包含“回归”,但实际上它用于分类任务,特别是对于输出为两个类别的情况。逻辑回归通过使用 logistic 函数将输入映射到一个在0,1范围内的概率值,然后根据这个概率值进行分类。 以下是逻辑回归的基本概念…

Kafka系列(一)【消息队列、Kafka的基本概念、Kafka的工作机制、Kafka可满足的需求、Kafka的特性、Kafka的应用场景】

kafka系列 一 一、消息队列1. 消息队列的来源2. 什么是消息队列3. 消息队列主要有哪些作用 二、Kafka的基本概念代理、生产者、消费者、消费者组主题、分区、副本、记录 三、了解 Kafka的工作机制-生产消息/消费消息四、Kafka可满足的需求五、Kafka的特性六、Kafka的场景 转自《…

[MFC] MFC消息机制的补充

之前写了[MFC] 消息映射机制的使用和原理浅析&#xff0c;还有些需要补充的&#xff0c;都记在这里。 MFC 消息的分类 MFC消息分为系统消息和自定义消息。 图片来源&#xff1a;C语言/C教程 大型源码案例分析&#xff1a;MFC消息系统的代码解析 易道云编程 系统消息分为窗口…

【前沿技术杂谈:开源软件】引领技术创新与商业模式的革命

【前沿技术杂谈&#xff1a;开源软件】引领技术创新与商业模式的革命 开源软件如何推动技术创新开源软件的开放性和协作精神促进知识共享和技术迭代推动关键技术的发展开源软件与新技术的融合 开源软件的商业模式开源软件的商业模式将开源软件与商业软件相结合 开源软件的安全风…

2023年哪个前端框架用的最多?

2023 年&#xff0c;TypeScript 的每月下载量持续稳定增长&#xff0c;年度累计下载量高达2,071,832,110&#xff08;20.7 亿&#xff09;&#xff0c;展现了强大的市场需求和用户认可。 本文来通过详细的数据&#xff08;2023 年 npm 累计下载量&#xff09;&#xff0c;看看…

idea中找到所有的TODO

idea中找到所有的TODO &#xff08;1&#xff09;快捷键 Alt6 &#xff08;2&#xff09;View -> Tool Windows -> TODO

【QT+QGIS跨平台编译】之二十一:【freetype+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、freetype介绍二、文件下载三、文件分析四、pro文件五、编译实践一、freetype介绍 FreeType是一个自由、开放源码、高质量字体处理引擎,被广泛应用于桌面、嵌入式操作系统、游戏和图形应用程序中。它提供了对字体文件解析、字体轮廓渲染、字体缓存管理、子像素定…

LNMP.

一.mysl配置 1.安装mysql yum install mysql-server -y 2.进入mysql配置文件目录 cd /etc/my.cnf.d3.编辑mysql配置文件 vim mysql-server.cnf 在[mysqld]中添加: character-set-serverutf84.启动mysql服务 systemctl start mysqld5.登入mysql mysql 6.创建数据库 cre…

C语言如何认识 printf()函数的格式字符?

一、问题 printf()函数对输出格式到底该如何控制呢&#xff1f; 二、解答 对不同类型的数据⽤不同的格式字符串&#xff0c;其中常⽤的有以下⼏种格式字符。 1、格式字符d 格式字符d⽤于输出⼗进制整数。有以下⼏种⽤法&#xff1a; &#xff08;1&#xff09;&#xff05;…

2023年09月CCF-GESP编程能力等级认证Python编程五级真题解析

Python等级认证GESP(1~6级)全部真题・点这里 一、单选题(共15题,共30分) 第1题 近年来,线上授课变得普遍,很多有助于改善教学效果的设备也逐渐流行,其中包括比较常用的手写板,那么它属于哪类设备?( ) A:输入 B:输出 C:控制 D:记录 答案:A 第2题 以下关于…

【Django】Cookie和Session的使用

Cookies和Session 1. 会话 从打开浏览器访问一个网站&#xff0c;到关闭浏览器结束此次访问&#xff0c;称之为一次会话。 HTTP协议是无状态的&#xff0c;导致会话状态难以保持。 Cookies和Session就是为了保持会话状态而诞生的两个存储技术。 2. Cookies 2.1 Cookies定…

新产品!可视化试卷搭建平台

hi, 大家好, 我是徐小夕. 之前和大家分享了很多可视化低代码和零代码的技术实现和产品设计思路, 也和大家分享了 H5-Dooring 零代码搭建平台的技术实现和未来规划, 今天继续和大家分享一下我们的新产品——橙子试卷. 橙子试卷 是一款可视化试卷/问卷搭建平台, 我们可以通过拖拽…

HttpRunner自动化测试之实现参数化传递

参数化实现及重复执行 参数化测试&#xff1a;在接口测试中&#xff0c;为了实现不同组数据对同一个功能模块进行测试&#xff0c;需要准备多组测试数据对模块进行测试的过程。 在httprunner中可以通过如下方式实现参数化&#xff1a; 1、在YAML/JSON 中直接指定参数列表 2、…

【HarmonyOS应用开发】ArkUI 开发框架-进阶篇-应用弹窗(十一)

一、应用弹窗 1、概述 在我们日常使用应用的时候&#xff0c;可能会进行一些敏感的操作&#xff0c;比如删除联系人&#xff0c;这时候我们给应用添加弹窗来提示用户是否需要执行该操作&#xff0c;如下图所示&#xff1a; 弹窗是一种模态窗口&#xff0c;通常用来展示用户…

树状数组复习

基本原理 树状数组的原理简单来说就是利用二进制拆分区间 我们可以对一个数进行二进制分解&#xff0c;最多分解成log(x)个数&#xff0c;同样我们可以对[1,n]这个区间进行分解。也是最多log段&#xff0c;每次修改时我们维护受到影响的区间&#xff0c;然后查询时用这log个区…

[晓理紫]每日论文分享(有中文摘要,源码或项目地址)--大模型、扩散模型、视觉

专属领域论文订阅 关注{晓理紫|小李子}&#xff0c;每日更新论文&#xff0c;如感兴趣&#xff0c;请转发给有需要的同学&#xff0c;谢谢支持 如果你感觉对你有所帮助&#xff0c;请关注我&#xff0c;每日准时为你推送最新论文。 为了答谢各位网友的支持&#xff0c;从今日起…

论文阅读:Learning Lens Blur Fields

这篇文章是对镜头模糊场进行表征学习的研究&#xff0c;镜头的模糊场也就是镜头的 PSF 分布&#xff0c;镜头的 PSF 与物距&#xff0c;焦距&#xff0c;光学系统本身的像差都有关系&#xff0c;实际的 PSF 分布是非常复杂而且数量也很多&#xff0c;这篇文章提出用一个神经网络…

数仓建模维度建模理论知识

0. 思维导图 第 1 章 数据仓库概述 1.1 数据仓库概述 数据仓库是一个为数据分析而设计的企业级数据管理系统。数据仓库可集中、整合多个信息源的大量数据&#xff0c;借助数据仓库的分析能力&#xff0c;企业可从数据中获得宝贵的信息进而改进决策。同时&#xff0c;随着时间的…

Xlua分析:C#调用Lua

本篇主题是C#如何调用lua的补充。 xLua交互知识 参考官方文档《programming in lua》的第24章开头&#xff0c;里面很详细地阐述了Lua和C是如何实现交互的&#xff1a;栈操作。Lua API用一个抽象的栈在Lua与C之间交换值。栈中的每一条记录都可以保存任何 Lua 值。如果想要从L…

算法42:天际线问题(力扣218题)---线段树

218. 天际线问题 城市的 天际线 是从远处观看该城市中所有建筑物形成的轮廓的外部轮廓。给你所有建筑物的位置和高度&#xff0c;请返回 由这些建筑物形成的 天际线 。 每个建筑物的几何信息由数组 buildings 表示&#xff0c;其中三元组 buildings[i] [lefti, righti, heig…