C语言知识(1) static修饰详解分享

1.前言

哈喽大家好啊,今天来给大家分享c中static的使用,希望能对大家有所帮助,请大家多多点赞,收藏支持我哦~

2.正文

在讲解static之前,先给大家铺垫三个概念,方便大家理解。

2.1三则知识铺垫

2.1.1作用域与生命周期

2.1.1.1作用域

作用域(scope)主要用来控制变量、函数或对象在程序中的可见性和生命周期。具体来说,作用域限定了一个变量、函数或对象在代码中的哪一部分可以被访问和使用。作用域的种类包括全局作用域、局部作用域和块级作用域。

2..1.1.2生命周期

生命周期,也指生存期(Lifetime),通常指的是一个对象、变量或数据结构在内存中存在的时间长度,即从它被创建或分配内存开始,到它不再被需要并被销毁或释放内存为止的这段时间。

3..1.1.3作用域和生命周期的联系

变量的作用域决定了它在代码中的可见性,而生存期决定了它在内存中的存在时间。虽然作用域和生存期经常是相关的,但它们不是同一个概念。例如,在C++中,一个局部变量在其作用域内是可见的,并且当控制流离开其定义的作用域时,它的生存期就结束了。总而言之,一个关注存活时间,另一个关注可适用范围。

2.1.2内存

相信读者会有一个疑问,我们static为什么要讲内存呢,因为static的使用本质上牵扯到一些内存的概念,将这里理解了就会对static的使用带来极大的帮助。

 

  • 栈区是一种后进先出的数据结构,用于存储程序运行时的局部变量和函数调用信息。当一个函数被调用时,其局部变量和函数参数会被分配到栈上。当函数返回时,这些变量会自动被销毁,栈的空间会被回收。。
  • 堆区是用于动态分配内存的区域,通常用于存储程序中需要在运行时进行分配和释放的数据。
  • 静态区(也称为全局区)用于存储程序中声明为静态的全局变量和静态局部变量。这些变量在程序运行期间都存在,并且它们的值在函数调用之间保持不变。静态区是在编译时分配内存空间的,因此其大小和位置在程序运行期间是固定的。静态区的生命周期与整个程序的执行周期相同,直到程序结束才由系统释放内存。

3.1.3链接属性

链接属性分别包括外部链接属性和内部链接属性。详细解释如下:

  • 外部链接通常指的是程序中定义的标识符(如全局变量或函数)在多个编译单元(通常是源文件)之间的可见性和共享性。当一个标识符被声明为具有外部链接时,它可以在整个程序的不同部分中被访问和引用,就好像它们是同一个实体一样。
  • 内部链接(也称为静态链接)是指标识符的作用域限制在其定义的编译单元内。与外部链接不同,具有内部链接的标识符在链接过程中不会暴露给其他编译单元,也不会与其他编译单元中的同名标识符发生冲突。

2.2static的使用

上面铺垫了这么多,接下来开始上正餐:

2.2.1修饰局部变量

接下来我举例子会使用包含俩个函数的代码:

第一段代码:

#include <stdio.h>  
void func() {
    int i = 0;
    i++;
    printf("%d\n", i);
}
int main() {
    for (int i = 0; i < 5; i++) {
        func();
    }
    return 0;
}

输出结果如图:

我们发现,上段没有实现逐个打印1,2,3,4,5的功能,那是因为func函数中i一旦完成便被销毁下一次for循环再进行func函数时,便还是重新创建i=0的操作。

第二段代码:

#include <stdio.h>  
void func() {
    static int i = 0;
    i++;
    printf("%d\n", i);
}
int main() {
    for (int i = 0; i < 5; i++) {
        func();
    }
    return 0;
}

输出结果如图:

经过static的修饰后,我们发现可以输出1,2,3,4,5了。因此我们可以得出,static的修饰本质上是使变量的生命周期得到了改变,i这个局部变量本来是储存在栈区,经修饰后储存在了静态区,特征就相当于全局变量了,生命周期延长,但作用域不变。

2.2.2修饰全局变量

局部变量经过static的修饰以后使用可以相当于全局变量,那么static修饰全局变量会有什么影响呢。

为了能够表现出static修饰全局变量后的效果,这里要引用一个extern

extern 是⽤来声明外部符号的,如果⼀个全局的符号在A⽂件中定义的,在B⽂件中想使⽤,就可以使用extern。

代码1:(以下是俩个源文件)
int a = 1;
#include<stdio.h>
int main() {
	extern int a;
	printf("%d", a);
	return 0;
}

这个代码可以正常输出1;

代码2:

static int a = 0;
#include<stdio.h>
int main() {
	extern int a;
	printf("%d", a);
	return 0;
}

用编译器一编译发现,这段代码没有办法正常输出。由此我们可以得出被static修饰后的全局变量只能在当下源文件去使用,全局变量本身是被默认具有外部连接属性,被修饰后该变量由外部连接属性变成内部连接属性,即使声明了,也是无法正常使用。

使⽤建议:如果⼀个全局变量,只想在所在的源⽂件内部使⽤,不想被其他⽂件发现,就可以使⽤ static修饰。

 2.2.3修饰函数

接下来再给大家附上俩段代码

代码1:

int func(int x, int y) {
	return x + y;
}
#include<stdio.h>
extern int func(int x ,int y);
int main() {
	int a = 0, b = 0;
	scanf("%d%d", &a, &b);
	printf("%d",func(a, b));
	return 0;
}

 这段代码运行后发现可以实现调用加法函数的功能,即能正常输出a+b的值。

代码2:

extern int func(int x, int y) {
	return x + y;
}
#include<stdio.h>
extern int func(int x ,int y);
int main() {
	int a = 0, b = 0;
	scanf("%d%d", &a, &b);
	printf("%d",func(a, b));
	return 0;
}

 调试后发现,这段代码无法正常输出,原因和static修饰全局变量类似,函数本身带有外部链接属性,经过extern修饰后,转换成内部链接属性,则函数的调用仅限于当前源文件中了。

使⽤建议:如果⼀个函数,只想在所在的源⽂件内部使⽤,不想被其他⽂件发现,就可以使⽤ static修饰。

3.小结

今天的分享到这里就结束了,希望喜欢的朋友多多支持我哦~

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

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

相关文章

写了一个 SRE 调试工具,类似一个小木马

远程操作机器有时会比较麻烦&#xff0c;我写了一个工具&#xff0c;主要功能&#xff1a;1.远程执行命令 2.上传下载文件。是一个 Web Server&#xff0c;通过 HTTP 请求来操作机器&#xff0c;类似一个小木马。当然&#xff0c;因为是一个 Web Server&#xff0c;所以也提供了…

批量人脸画口罩

网上参考的修改了一下&#xff0c;图片放在根目录&#xff0c;命名叫做1.png&#xff0c;批量人脸画口罩 这个程序的目的是为了解决人脸数据集中的特征点缺失的不足 # -*- coding: utf-8 -*- import os import numpy as np from PIL import Image, ImageFile__version__ 0.3…

短视频矩阵源头====技术文档交付

短视频矩阵源头技术文档交付 搭建短视频矩阵系统源码需要以下步骤&#xff1a; 1. 确定系统需求和功能&#xff1a;明确系统需要支持哪些功能&#xff0c;例如短视频的上传、存储、播放、分享、评论、点赞等。 2. 选择合适的编程语言和框架&#xff1a;根据需求选择合适的编程…

【python】描述性统计计算偏斜度和峭度

文章目录 1.编写计算偏斜度和峭度的函数。并用自己编写的函数计算课本23页的习题1.5数据的偏斜度和峭度。2.从1.5数据中随机抽取2个容量为20的样本&#xff0c;分别计算它们的平均数和标准差3.请绘制给定数据的频率分布直方图&#xff0c;计算数据的均值、标准差、偏斜度和峭度…

IDP之Backstage - 环境搭建

0. 目录 1. 前言2. 环境准备&#xff08;Windows10下&#xff09;2.1 安装nvm2.2 git和docker安装 3. 创建模板项目3.1 典型错误: fails on the yarn install step3.2 再次启动3.3 验证 4. 相关 1. 前言 本不想写这篇&#xff0c;因为看着官网文档写着挺简单的&#xff0c;但实…

【C语言】多字节字符、宽字符(涉及字符集和编码)

字符集、编码&#xff1a; 字符集&#xff1a;一个系统支持的所有抽象字符的集合。字符是各种文字和符号的总称&#xff0c;包括各国家文字、标点符号、图形符号、数字等。例如&#xff1a;ASCII、Unicode、GB2312、GBK、GB18030、BIG5(繁体中文) ... 编码方式&#xff1a;符号…

半导体厂商

引言&#xff1a; 学习了这么久了&#xff0c; 突然发现对某些陌生类型的单片机的历史、公司、不是很了解&#xff0c; 很多只是听说过&#xff0c; 本文的分享就是为了解决关于上述疑问的。 目录 C51 STM32 AVR PIC NXP&#xff08;恩智浦&#xff09; Infineon (英飞凌…

2024新手做电商——哪个平台开店更好做?多平台对比分析!

哈喽~我是电商月月 随着互联网的发展&#xff0c;线下创业越来越不好做 相对于其他创业项目来说&#xff0c;电商的门槛还相对低一点&#xff0c;所以一大批人创业的选择&#xff0c;就看向了电商行业 但准备开店的新手朋友纠结了&#xff1a;自己没有基础&#xff0c;选择哪…

Java面试:MySQL面试题汇总

1.说一下 MySQL 执行一条查询语句的内部执行过程&#xff1f; 答&#xff1a;MySQL 执行一条查询的流程如下&#xff1a; 客户端先通过连接器连接到 MySQL 服务器&#xff1b;连接器权限验证通过之后&#xff0c;先查询是否有查询缓存&#xff0c;如果有缓存&#xff08;之前…

中海达亮相全国地灾防治成果交流会, 硬核产品引关注

4月17日-18日&#xff0c;全国地质灾害防治新方法新技术新设备成果交流会在云南昆明召开。本次活动主题为“提升地质灾害防治能力&#xff0c;服务保障高质量发展”&#xff0c;由中国地质灾害防治与生态修复协会举办&#xff0c;来自业务主管部门、行业协会及相关企业等800多名…

JS-33-jQuery02-选择器

一、单个选择器 选择器是jQuery的核心。 一个选择器写出来类似$(#dom-id)。 美元符号定义 jQuery 为什么jQuery要发明选择器&#xff1f;回顾一下DOM操作中我们经常使用的代码&#xff1a; // 按ID查找&#xff1a; var a document.getElementById(dom-id);// 按tag查找&am…

3d模型渲染怎么会没材质---模大狮模型网

在进行3D模型渲染时&#xff0c;有时会遇到材质丢失的问题&#xff0c;这可能会给设计师们带来一些困扰。材质是渲染的重要组成部分&#xff0c;它们赋予了模型真实感和视觉吸引力。然而&#xff0c;当模型在渲染过程中出现没有材质的情况时&#xff0c;可能会导致最终效果不如…

服务器数据恢复—RAID5故障导致SAP+oracle数据丢失的数据恢复案例

服务器存储数据恢复环境&#xff1a; 某品牌服务器存储中有一组由6块SAS硬盘组建的RAID5阵列&#xff0c;其中有1块硬盘作为热备盘使用。上层划分若干lun&#xff0c;存放Oracle数据库数据。 服务器存储故障&分析&#xff1a; 该RAID5阵列中一块硬盘出现故障离线&#xff0…

C++类和对象第二弹(构造,析构和拷贝构造函数)

目录 前言 1. 类的6个默认成员函数 2. 构造函数 2.1 概念 2.2 特性 3. 析构函数 3.1 概念 3.2 特性 4. 拷贝构造函数 4.1 概念 4.2 特征 总结 前言 本文主要讲解类中构造函数、析构函数和拷贝构造函数。关于这三个类中默认成员函数的知识点很多&#xff0c;有许多…

OSPF笔记+大实验

OSPF综合大实验---实验报告 配置IP地址 R1&#xff1a; [R1]int g0/0/0 [R1-GigabitEthernet0/0/0]ip add 172.16.33.1 24 [R1-GigabitEthernet0/0/0]int l0 [R1-LoopBack0]ip add 172.168.34.1 24 R2: [R2]int g0/0/0 [R2-GigabitEthernet0/0/0]ip add 172.16.33.2 24…

云服务器租用价格多少钱一年?

云服务器租用价格多少钱一年&#xff1f;61元一年起。现在租一个服务器多少一个月&#xff1f;云服务器一年费用多少钱&#xff1f;优惠价格低至3.8元1个月&#xff0c;租用云服务器收费价格表&#xff1a;阿里云和腾讯云2核2G3M服务器优惠价格61元一年、云服务器是99元一年&am…

秋招之路 面经

这里参考一位很厉害的前辈所分享的他的嵌入式软件工程师秋招之路&#xff0c;自己详细的读了一下他的经历以及他的分享的秋招面试和项目经验的总结。 我的嵌入式软件工程师秋招之路&#xff08;文末送福利&#xff09;_嵌入式软件工程师 刷leetcode-CSDN博客 如何在面试中介绍…

鸿蒙TypeScript学习第19天【命名空间】

1、TypeScript 命名空间 命名空间一个最明确的目的就是解决重名问题。 假设这样一种情况&#xff0c;当一个班上有两个名叫小明的学生时&#xff0c;为了明确区分它们&#xff0c;我们在使用名字之外&#xff0c;不得不使用一些额外的信息&#xff0c;比如他们的姓&#xff0…

15V转5V3A降压同步WT6019

15V转5V3A降压同步WT6019 WT6019则是一种高效的同步降压转换器。它可以将15V的输入电压稳定转换为5V的输出电压&#xff0c;并保证最大3A的电流输出。这种转换器的核心在于其内部的功率MOSFET&#xff0c;它能够以较低的导通电阻和快速的开关速度&#xff0c;实现高效率的能量…

突破界限:LangChain 引领 AI 应用构建的新时代

前言 在上一篇文章中我们对 ChatWithPDF 的方案设计进行了整体的概览&#xff0c;现在细化下整体流程&#xff0c;如下图所示&#xff1a; 针对上面的流程&#xff0c;我们思考&#x1f914;一下会面临的问题&#xff1a; 如何读取 PDF 中的内容&#xff1f;&#xff08;肯定…
最新文章