【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: 15
    printf("Non-Static Function Result: %d\n", result2);//Non-Static Function Result: 5
    
    return 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 = 1
    func2();//func2: count = 2
    func1();//func1: count = 3
    
    return 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函数打印出结构体的成员变量的值。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++入门学习指南】:函数重载提升代码清晰度与灵活性

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; C入门到进阶 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一、函数重载1.1 函数重载的概念1.2 函数重载的作用1.3 C支持函数重载的原理1.4 扩展 &…

寒假作业-day3

1>请编程实现双向链表的头插&#xff0c;头删、尾插、尾删 请编程实现双向链表按任意位置插入、删除、修改、查找 代码&#xff1a; #include<stdio.h> #include<stdlib.h> #include<string.h>typedef int datatype; typedef struct Node{datatype data…

PHP入门指南:起步篇

PHP入门指南&#xff1a;起步篇 PHP入门指南&#xff1a;起步篇什么是PHP&#xff1f;PHP 的优点PHP 开发环境搭建选择本地服务器软件包安装PHP环境配置Web服务器和PHP测试PHP安装 第一个PHP脚本PHP基础语法标记注释变量数据类型常量条件语句循环函数 PHP入门指南&#xff1a;起…

python算法与数据结构---动态规划

动态规划 记不住过去的人&#xff0c;注定要重蹈覆辙。 定义 对于一个模型为n的问题&#xff0c;将其分解为k个规模较小的子问题&#xff08;阶段&#xff09;&#xff0c;按顺序求解子问题&#xff0c;前一子问题的解&#xff0c;为后一子问题提供有用的信息。在求解任一子…

【MySQL】- 09 Select Count

【MySQL】- 09 Select Count 1认识COUNT2 COUNT(列名)、COUNT(常量)和COUNT(*)之间的区别3 COUNT(*)的优化 4 COUNT(*)和COUNT(1)5 COUNT(字段)总结 数据库查询相信很多人都不陌生&#xff0c;所有经常有人调侃程序员就是CRUD专员&#xff0c;这所谓的CRUD指的就是数据库的增删…

产业热点 | 从 Vision Pro 发售,洞见空间计算时代新机遇

*图源&#xff1a;Apple 官网 近日首批 Vision Pro 启动预约发售&#xff0c;短短一周就预估售出 20 万台&#xff0c;如今正式发售在即&#xff0c;再度受到各界的热切关注。 *图源&#xff1a;Apple 官网 同样作为空间计算赛道企业&#xff0c;ALVA Systems 在过去十余年始…

IP数据云识别真实IP与虚假流量案例

随着互联网的普及&#xff0c;企业在数字领域面临着越来越复杂的网络威胁。为了保护网站免受虚假流量和恶意攻击的影响&#xff0c;许多企业正在采用IP数据云。本文将结合一个真实案例&#xff0c;深入探讨IP数据云如何成功准确地识别真实用户IP和虚假流量IP&#xff0c;提高网…

ESU毅速丨3D打印技术引领模具制造创新革命

随着科技的飞速发展&#xff0c;3D打印技术已经成为制造业的新宠。而在模具制造领域&#xff0c;3D打印技术更是带来了巨大的创新价值&#xff0c;引领着模具制造的革命性变革。 传统模具制造过程中&#xff0c;需要经过多道繁琐工序&#xff0c;而3D打印技术简化了这一过程。3…

python接口自动化(五)--接口测试用例和接口测试报告模板(详解)

简介 当今社会在测试领域&#xff0c;接口测试已经越来越多的被提及&#xff0c;被重视&#xff0c;而且现在好多招聘信息要对接口测试提出要求。区别于传统意义上的系统级别测试&#xff0c;很多测试人员在接触到接口测试的时候&#xff0c;也许对测试执行还可以比较顺利的上手…

基于场景文字知识挖掘的细粒度图像识别算法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 摘要Abstract文献阅读&#xff1a;基于场景文字知识挖掘的细粒度图像识别算法1、研究背景2、方法提出方法模块 3、试验4、文章贡献 二、RNN代码学习2.1、什么是RNN2…

day43_jdbc

今日内容 0 复习昨日 1 SQL注入问题 2 PreparedStatement 3 完成CRUD练习 4 ORM 5 DBUtil (properties) 6 事务操作 0 复习昨日 已经找人提问… 1 SQL注入 1.1 什么是SQL注入 用户输入的数据中有SQL关键词,导致在执行SQL语句时出现一些不正常的情况.这就是SQL注入! 出现SQL注入…

两种方式实现文本超出指定行数显示展开收起...

需要实现这样一个功能 默认高度下文本超出隐藏&#xff0c;点击展开可查看所有内容&#xff0c;点击收起可折叠 方法一&#xff1a;通过html和css实现 代码部分 html:<div className"expand-fold"><input id"check-box" type"checkbox&qu…

幻兽帕鲁游戏中走路卡顿并且会出现回弹是什么原因?

可能原因是最近的 1.4.0 更新后&#xff0c;代码中有一个启动参数的加入&#xff0c;导致 CPU 占用极高。 可以远程连接你的服务器 然后执行下面的代码&#xff0c;删除代码中的那个启动参数。 # 删除可能导致人物回弹的游戏服务器启动参数 sudo -u ecs-assist-user sed -i s…

ios搭建OpenGL环境

前言 本篇文章介绍在ios搭建OpenGL开发环境 在app的启动文章中&#xff0c;讲述了一个ios应用是如何启动的以及在IOS 13之后苹果公司推出的多窗口功能&#xff0c;通过app的启动这篇文章&#xff0c;我们基本能随心所欲的搭建一个app应用环境&#xff0c;搭建完成后的基本文件…

雨课堂怎么搜答案?七个受欢迎的搜题分享了 #微信#职场发展雨课堂怎么搜答案?七个受欢迎的搜题分享了 #微信#职场发展

积极参加社团活动和实践项目&#xff0c;可以帮助大学生拓宽人脉圈和锻炼实际操作能力。 1.福昕翻译 可以一键翻译文档内容&#xff0c;并提供还原排版的译文&#xff0c;对经常看外文文献的朋友来说&#xff0c;绝对是福音 福昕翻译是一流专业的在线翻译服务平台,支持PDF文…

一文带你了解编码集

编码集 1. ASCII编码&#xff1a; 127个字母 8个数据位足够存储字母、数字、符号&#xff0c;支持到0x7F。 2. GB2312编码 每个汉字占据2个字节(高位和低位)&#xff0c;16个数据。GB2312是对ASCII的中文扩展&#xff0c;共包含7000多个汉字。是计算机发展到中国后发展起来…

Python算法100例-1.3 牛顿迭代法求方程根

完整源代码项目地址&#xff0c;关注博主私信’源代码’后可获取 1&#xff0e;问题描述 编写用牛顿迭代法求方程根的函数。方程为 a x 3 b x 2 c x d 0 ax^3bx^2cxd0 ax3bx2cxd0&#xff0c;系数a、b、c、d由主函数输入&#xff0c;求x在1附近的一个实根。求出根后&…

VBA字典与数组第十一讲:普通公式与数组公式的本质区别

《VBA数组与字典方案》教程&#xff08;10144533&#xff09;是我推出的第三套教程&#xff0c;目前已经是第二版修订了。这套教程定位于中级&#xff0c;字典是VBA的精华&#xff0c;我要求学员必学。7.1.3.9教程和手册掌握后&#xff0c;可以解决大多数工作中遇到的实际问题。…

MAE实战:使用MAE提高主干网络的精度(一)

摘要 MAE已经出来有几年了&#xff0c;很多人还不知道怎么去使用&#xff0c;本文通过两个例子说明一下。分两部分&#xff0c;一部分介绍一个简单的例子&#xff0c;让大家了解MAE训练的流程。一部分是一个新的模型&#xff0c;让大家了解如何将自己的模型加入MAE。 论文标…