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

news/2024/11/29 10:43:31/

目录

一、静态本地变量

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.ppmy.cn/news/1342426.html

相关文章

前端vue/react项目压缩图片工具@yireen/squoosh-browser

想要在前端项目中压缩图片&#xff0c;然后再上传到后端保存&#xff0c;就需要一个压缩工具的帮助&#xff0c;暂时有两个依赖库可以选择&#xff1a;image-conversion和yireen/squoosh-browser&#xff0c;看了官方仓库地址和更新时间等详情&#xff0c;发现还是yireen/squoo…

ES6-数组的解构赋值

一、数组的解构赋值的规律 - 只要等号两边的模式相同&#xff0c;左边的变量就会被赋予对应的值二、数组的解构赋值的例子讲解 1&#xff09;简单的示例&#xff08;完整的解构赋值&#xff09; 示例 //基本的模式匹配 // a&#xff0c;b,c依次和1&#xff0c;2&#xff0c…

2024美赛C题完整解题教程及代码 网球运动的势头

2024 MCM Problem C: Momentum in Tennis &#xff08;网球运动的势头&#xff09; 注&#xff1a;在网球运动中&#xff0c;"势头"通常指的是比赛中因一系列事件&#xff08;如连续得分&#xff09;而形成的动力或趋势&#xff0c;这可能对比赛结果产生重要影响。球…

[Unity Sentis] Unity Sentis 详细步骤工作流程

文章目录 1. 导入模型文件支持的模型创建运行时模型导入错误 2. 为模型创建输入将数组转换为张量创建多个输入进行操作 3. 创建一个引擎来运行模型创建一个Worker后端类型 4. 运行模型5. 获取模型的输出获取张量输出多个输出打印输出 1. 导入模型文件 要导入 ONNX 模型文件&am…

云端录制直播流视频,上传云盘

前言 哪一天我心血来潮&#xff0c;想把我儿子学校的摄像头视频流录制下来&#xff0c;并保存到云盘上&#xff0c;这样我就可以在有空的时候看看我儿子在学校干嘛。想到么就干&#xff0c;当时花了一些时间开发了一个后端服务&#xff0c;通过数据库配置录制参数&#xff0c;…

第九章 通过 ODBC 连接 SQL 网关 - 特定于实现的 ODBC 连接选项

文章目录 第九章 通过 ODBC 连接 SQL 网关 - 特定于实现的 ODBC 连接选项特定于实现的 ODBC 连接选项Legacy Outer Join需要长数据长度支持 Unicode 流默认情况下不使用分隔标识符Use COALESCE复合行 ID 的转换 第九章 通过 ODBC 连接 SQL 网关 - 特定于实现的 ODBC 连接选项 …

mysql中kill命令的含义和用法

在MySQL中&#xff0c;KILL QUERY 和 KILL CONNECTION 是用来终止正在运行的进程的两个不同命令&#xff0c;它们对应的使用场景和影响范围有所不同。这两个命令后面都需要跟一个线程ID&#xff08;也称为进程ID&#xff09;&#xff0c;这个ID指的是MySQL服务器上当前运行的一…

Unity | 资源热更(YooAsset AB)

目录 一、AssetBundle 1. 插件AssetBundle Browser 打AB包 &#xff08;1&#xff09;Unity&#xff08;我用的版本是2020.3.8&#xff09;导入AssetBundle Browser &#xff08;2&#xff09;设置Prefab &#xff08;3&#xff09;AssetBundleBrowser面板 2. 代码打AB包…