【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.hqwc.cn/news/454131.html

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

相关文章

数据库管理phpmyadmin

子任务1-PHPmyadmin软件的使用 本子任务讲解phpmyadmin的介绍和使用操作。 训练目标 1、掌握PHPmyadmin软件的使用方法。 步骤1 phpMyAdmin 介绍 phpmyadmin是一个用PHP编写的软件工具&#xff0c;可以通过web方式控制和操作MySQL数据库。通过phpMyAdmin可以完全对数据库进行…

使用pandas将excel转成json格式

1.Excel数据 2.我们想要的JSON格式 {"0": {"raw_data1": "Sam","raw_data2": "Wong","raw_data3": "Good","layer": "12v1"},"1": {"raw_data1": "Lucy…

渗透测试练习题解析 2(CTF web)

题目均来自 BUUCTF 1、[极客大挑战 2019]Upload 1 考点&#xff1a;文件上传漏洞 进入靶场 一看就知道是考察文件上传漏洞&#xff0c;看源码有没有敏感信息 没有什么敏感信息&#xff0c;那我们试着按要求传一张图片看看结果&#xff0c;但是传了 png、jpg 类型的图片后发现上…

Dijkstra算法(求最短路)

简介&#xff1a; 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的&#xff0c;因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法&#xff0c;解决的是有权图中最短路径问题。 特点&#xff1a; 迪杰斯特拉算法采用的是一种贪心策略&a…

深度神经网络中的BNN和DNN:基于存内计算的原理、实现与能量效率

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言引言内存计算体系结构深度神经网络&#xff08;DNN&#xff09;随机梯度的优…

kvm qemu 优化 windows 虚拟机速度

主要优化磁盘 io 和网络 io 都选为 virtio windows 驱动下载 https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/virtio-win-0.1.185-2/virtio-win-0.1.185.iso I also had incredibly slow performance with my virtual HDD. The followin…

IP地址信息在保险行业的创新应用与解决方案

随着数字化时代的来临&#xff0c;保险行业正积极探索新的技术手段&#xff0c;以提升服务效能、降低风险&#xff0c;并更好地满足客户需求。IP地址信息作为一种重要的数字化工具&#xff0c;在保险行业中展现了广泛的应用前景。IP数据云将深入探讨IP地址信息在保险行业中的创…

C# Socket通信从入门到精通(21)——Tcp客户端判断与服务器断开连接的三种方法以及C#代码实现

前言 我们开发的tcp客户端程序在连接服务器以后,经常会遇到服务器已经关闭但是作为客户端的我们不知道,这时候应该应该有一个机制我们可以实时监测客户端和服务器已经断开连接,如果已经断开了连接,我们应该及时报警提示用户客户端和服务器已经断开连接,本文介绍三种可以监…

VM安装Centos7

目标&#xff1a; 一&#xff0c;安装Centos7 二&#xff0c;ssh可以连接 1 新建虚拟机 一直下一步 2 直到此处&#xff0c;选择稍后安装 一直下一步直到完成。 3 选中虚拟机&#xff0c;点击设置 选择CD/DVD&#xff0c;选取ISO映像文件。 4 等待安装 并且设置root密码 5…

R语言:箱线图绘制(添加平均值趋势线)

箱线图绘制 1. 写在前面2.箱线图绘制2.1 相关R包导入2.2 数据导入及格式转换2.3 ggplot绘图 1. 写在前面 今天有时间把之前使用过的一些代码和大家分享&#xff0c;其中箱线图绘制我认为是非常有用的一个部分。之前我是比较喜欢使用origin进行绘图&#xff0c;但是绘制的图不太…

栈--数据结构

初始化栈、入栈、出栈 栈&#xff1a;只允许在一端进行插入或删除操作的线性表 栈顶&#xff08;Top&#xff09; 代码实战步骤依次是初始化栈&#xff0c;判断栈是否为空&#xff0c;压栈&#xff0c;获取栈顶元素&#xff0c;弹栈。 代码 #include <stdio.h>#define …

openEuler 社区 2024 年 1 月运作月报

概述 2024年1月底&#xff0c;openEuler委员会会议在北京召开&#xff0c;会上总结了社区2023年的运营治理成果和经验&#xff0c;并审议了openEuler社区2024年的目标和计划。 在本月SIG组的运作上&#xff0c;ROS SIG继续拓展ROS2移植版图&#xff0c;新增支持ROS2软件包若干…