鹏哥C语言复习——const和static

目录

const讲解

1、const 放在*的左边

2、const 放在*的右边

static讲解

1、static修饰局部变量

2、extern关键字

3、static修饰全局变量

4、static修饰函数


 

const讲解

const int n = 10;
n = 0;

如上述代码,代码运行后会报错,会提示:左值指定 const 对象

因此,如果我们使用了 const 去修饰一个变量,那么这个变量就无法被改变。

此处的const是常属性,代表着由其修饰的变量不能被修改了;可即使 n 不能被修改了,他依然还是个变量,他被叫做常变量。在C89中,数组长度是不允许使用变量的,当我们将一个由const修饰的变量来表示数组长度,依旧会报错:应输入常量表达式。由此可见,const修饰的变量依旧是变量。

思考:(以上述代码为例)如果我们开创一个指向 n 变量地址的指针,那么通过指针来改变 n 的值,是否可以呢?

int* p = &n;
*p = 20;

 答:可以。const所修饰的只是n这个变量,而不是指向n地址的指针;解引用p指针,修改其值,最后p指向的n变量地址里存放的值改变了,也就完成了改变n的值的效果。

如果使用const去修饰指针变量,共会分成以下两种情况: const int* 、int* const

1、const 放在*的左边

const int n = 10;
int m = 100;
const int* p = &n;
*p = 20; //代码1
p = &m;	 //代码2

上述代码中,代码1会报错,代码2能够正常运行。

const 放在*的左边,限制的是*p,意思是不能通过p来改变p指向的对象的内容,但是p指针本身是可以被改变,它可以指向其他对象的地址

代码1:解引用操作被限制了,不能对p指针进行解引用操作

代码2:p指针所指向的地址被改变了,并没有对p指针进行解引用操作

2、const 放在*的右边

const int n = 10;
int m = 100;
int* const p = &n;
*p = 20; //代码1
p = &m;	 //代码2

上述代码中,代码1能够正常运行,代码2会报错。

const 放在*的右边,限制的是p,意思是不能改变p本身的值,但是p指向的内容是可以通过p来改变的。

代码1:对p进行解引用操作,并重新赋值

代码2:将p指针指向新的空间地址

总结:左边不可解引用,右边可以解引用。

 

static讲解

1、static修饰局部变量

void test()
{
	static int a = 1;
	a++;
	printf("%d", a);
}


int main()
{
	int i = 0;
	while (i < 10)
	{
		test();
		i++;
	}
	return 0;
}

以上代码的结果不为10个2,而是2 3 4 5 6 7 8 9 10 11

原因解析(代码讲解):

static 修饰的变量出了作用域是不会销毁的。本质上,static修饰局部变量的时候,变量会在静态区分配内存;这影响了变量的生命周期,生命周期变长,和程序的生命周期一样

程序经历的六个阶段(生命周期):

1.编译        2.预处理        3.编译        4.汇编        5.链接        6.执行

请注意,上述代码中,由static修饰的变量a的值只是不会在每次调用函数时重新创建赋值,但这不是说它就是个全局变量;a是变成了静态局部变量,使得每次调用test的时候a不会被重置。这就有点像局部变量没了创建和销毁的过程。

 在进行static修饰全局变量或函数的讲解以前,我们先得了解一个名为“extern”的关键字

2、extern关键字

extern被称为“声明外部符号”,如果有两个文件(如下图),我们想要在test.c文件调用add.c文件中的内容,那么就必须通过extern关键字告知编译器

faa576af56f848d1ad3c1e61ea6cc1ad.png

3、static修饰全局变量

13b7f22a17384cafb4d38830e03a983f.png

当使用了static修饰g_val这个变量以后,test.c文件中就不能使用g_val这个变量了

原因讲解:static修饰全局变量的时候,这个全局变量的外部链接属性就变成了内部链接属性。其他源文件(指的是 .c 问卷)就不能再使用到这个全局变量了。 

4、static修饰函数

bf9501288e0a4fe3bc39d69f6772c939.png

一个函数本身是具有外部链接属性的,因此如果在test文件中不使用“extern”关键字,程序只会报一个警告,但并不会因为没有这个关键字而报错运行不起来。函数外部声明方式如上图。(最好还是声明以下,以防程序出问题)

但函数被static修饰的时候,外部链接属性就变成了内部链接属性,其他源文件就不能使用了。 

 

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

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

相关文章

Fiink的简单学习一

一 相关大数据概念 1.1 根据时间 1.实时计算&#xff1a; 数据实时处理&#xff0c;结果实时存储 是一种持续、低时延、事件触发的任务 2.离线计算&#xff1a; 数据延迟处理&#xff0c;结果N1模式(昨天的数据今天存储) 是一种批量、高时延、主动发起的计算任务 1.2 处…

B端管理系统:深色系界面能够给用户带来什么感觉?

深色系的B端界面通常会给用户带来一种严肃、专业、稳重的感觉。这种界面设计通常会使用深色的背景和明亮的文字、图标&#xff0c;给人一种沉稳的视觉效果。 用户在使用深色系的B端界面时&#xff0c;可能会感到界面设计非常注重数据和信息的展示和分析&#xff0c;具有高度的…

Esxi_FAQ_2024.6.3

问题1-内存设置无效 问题&#xff1a; 内存设置无效: 内存预留 (sched.mem.min) 应该等于内存大小 (32768设置的内存容量) 原因&#xff1a; 是因为直通了nvme硬盘&#xff0c;在没有直通nvme硬盘时&#xff0c;不预留内存开机也不会报错。 解决&#xff1a; 需要全部预留内存…

小程序项目创建与Vant-UI引入

一&#xff0c;创建小程序项目 AppID可先用测试号&#xff1b; 模板来源选择 ’全部来源‘ &#xff0c;’基础‘ 。模板一定JS开头的&#xff1b; vant-weapp 官网 vant-Weapp 二&#xff0c;下载vant-weapp 组件 1&#xff0c;在新项目中打开 ’调试器‘&#xff1b; 2…

【大学物理实验】速通双语版

0首先&#xff0c;我们要学什么&#xff1f;outlook&#xff01; 1measurement 2system error&random error 3significant figures 4uncertainty of direct measurement and indirect measurement 5data processing 1 measurement Important points to remember&#…

文件夹批量改名每个不一样?文件夹批量命名的6种工具!(新)

在日常工作和学习中&#xff0c;我们经常需要处理大量的文件夹&#xff0c;并对它们进行有序的命名和管理。手动一个一个地改名不仅效率低下&#xff0c;而且容易出错。幸运的是&#xff0c;现在有许多工具可以帮助我们实现文件夹的批量重命名&#xff0c;确保每个文件夹的名称…

MySQL—函数—函数小结

一、引言 前面博客我们已经学完了MySQL的函数&#xff0c;下面快速的对MySQL的函数做一个小结。 在讲解了MySQL的函数的时候&#xff0c;主要有四个方面&#xff1a; 1、字符串函数 &#xff08;1&#xff09;CONCAT&#xff1a;字符串连接 &#xff08;2&#xff09;LOWER、…

下载旧版postman(无需要登录,无需联网,即可轻松使用postman)

https://www.filehorse.com/download-postman/old-versions/page-3/ 人工智能学习网站 https://chat.xutongbao.top

docker+vue云服务器打包镜像相关操作

dockervue云服务器打包镜像相关操作 容器化部署似乎成了当前一个非常主流的趋势&#xff0c;无论是前端还是后端&#xff0c;流行的操作就是给你一个镜像地址&#xff0c;让你自己去拉取镜像并运行镜像。这似乎是运维的工作&#xff0c;但是在没有专有运维的情况下&#xff0c…

【Java数据结构】详解Stack与Queue(二)

&#x1f512;文章目录: 1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; 2.栈的应用场景 2.1逆序打印链表 2.2逆波兰表达式求值 2.3括号匹配 2.4出栈入栈次序匹配 2.5最小栈 3. 栈 虚拟机栈 栈帧的区别 4.总结 1.❤️❤️前言~&#x1f973…

1371. 每个元音包含偶数次的最长子字符串

1371. 每个元音包含偶数次的最长子字符串 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a;_1371每个元音包含偶数次的最长子字符串 错误经验吸取 原题链接&#xff1a; 1371. 每个元音包含偶数次的最长子字符串 https://leetcode.cn/pro…

Qos基础

一、Qos概述 Qos是一个框架&#xff0c;解决服务质量&#xff0c;尽力而为模型&#xff0c;集成服务以及区分服务模型&#xff0c;流量分类与标识。 使用Qos是带宽不够。 每个接口有硬件队列和软件队列&#xff08;队列排满了就不会再排&#xff09;。 企业宽带一般都是上行和下…

使用 Scapy 库编写 ICMP 重定向攻击脚本

一、介绍 ICMP重定向攻击&#xff08;ICMP Redirect Attack&#xff09;是一种网络攻击&#xff0c;攻击者通过发送伪造的ICMP重定向消息&#xff0c;诱使目标主机更新其路由表&#xff0c;以便将数据包发送到攻击者控制的路由器或其他不可信任的设备上。该攻击利用了ICMP协议…

【三维重建NeRF(三)】Mip-NeRF论文解读

本文结合深蓝学院课程学习和本人的理解&#xff0c;欢迎交流指正 文章目录 Mip-NeRF流程简述混叠问题与MipMapMip-NeRF提出的解决办法圆锥台近似计算与集成位置编码(IPE) Mip-NeRF流程简述 Mip-NeRF的大体流程和NeRF基本是一样的&#xff0c;NeRF介绍 创新的部分就是针对NeRF…

定格动态:如何用前端实现视频帧截图

在这样一个图像化极其重要的时代&#xff0c;从视频中提取精彩瞬间&#xff0c;即视频帧截图的技术&#xff0c;已成为前端开发中的一个亮点。JavaScript作为网页动态效果和交互的主力军&#xff0c;其在视频处理领域能力逐渐被挖掘和重视&#xff0c;尤其是视频帧截图技术的应…

GaN功率电子器件中体缺陷相关机制的建模仿真研究

在电力电子器件的外延生长和器件制备过程中&#xff0c;缺陷是不可避免的&#xff0c;大量的缺陷在一定程度上会牺牲器件的击穿电压、导通电阻等性能&#xff0c;同时影响器件的可靠性。近期&#xff0c;河北工业大学和广东工业大学联合开发了缺陷相关的仿真模型&#xff0c;深…

gitblit 环境搭建,服务器迁移记录

下载 Gitblit&#xff1a; http://www.gitblit.com/ JDK&#xff1a;gitblit网站显示需要jdk1.7&#xff0c;这里用的1.8。 Git&#xff1a;到官网下载最新版本安装 1). 分别安装JDK&#xff0c;Git&#xff0c;配置环境变量&#xff0c;下载并解压Gitblit 2). 创建代码仓库 …

每日一题《leetcode--LCR 029.循环有序列表的插入》

https://leetcode.cn/problems/4ueAj6/ 这道题整体上想插入数据有三种情况&#xff1a; 1、整个列表是空列表&#xff0c;需要返回插入的结点 2、整个列表只有一个结点&#xff0c;需要在头结点后插入新结点&#xff0c;随机把新结点的next指向头结点 3、整个列表的结点 >1 …

052、Python 集合及其使用

集合&#xff08;Set&#xff09;是一种无序且元素唯一的数据结构&#xff0c;用于存储不重复的元素&#xff08;即集合具有无序性和互异性两个重要特性&#xff09;。集合可以用于执行集合操作&#xff0c;如并集、交集、差集等。 定义集合 可以使用大括号 {} 或者 set() 函…

供应MT7662TUN/C进口芯片现货

长期供应各品牌进口芯片现货&#xff1a; MT7662TUN/C DLPC4421A DLPC4422A DAD2000 IT6634 DDP4421-HV PMD1000 SiHA120N60E AM8280 AM90N06-03B P15F60HP2 MSD6A838UYGN-8-003D 5AGXBA5D4F31C5G MCZ5209SN STM32L431CCT6 PT2833 ES858 TPS74301RGWR CSD18…