关于 变量

news2024/11/25 22:41:11

关于局部变量和静态变量(基于有一定指针基础)

#include<stdio.h>
void aaa()
{
	int n=10;

	
}
int main()
{
	
	printf("%d",n);
    return 0;
}

在这个代码里,很明显会报错,未定义该n标识符,因为这个n是局部变量,只作用于这个函数里面,然后再来介绍一下标识符的作用域和生命周期:

某个标识符的生命周期表示这个标识符存在的周期,即在声明的代码块创建时开始,在改代码块结束时自动销毁,也就是会释放它所占的空间;

而标识符作用域即在它声明时开始,在该代码块结束时结束;

无论是变量还是加了const声明的常量都是一样;

而在这段代码里面就是在aaa函数开始创建时n的生命周期开始,在这个函数结束时自动销毁它即结束;它的作用域也就是在它声明时int n;开始,在这个函数结束时结束;所以它的作用域并没有走出这个函数,所以在主函数里面直接打印是不可以的;

不可以直接写,那么可以用函数返回它的指针(这样还不如直接返回它的值打印),然后在求出它的值,我之前就会这么写,现在想起来也是错误的:

#include<stdio.h>
int * aaa()
{
    int n=10;
	int* p = &n;
	return p;
	
}
int main()
{
	int* h = aaa();
	printf("%d",*h);
    return 0;
}

虽然结果是正确的,但是实际上是不可以的,由于这时候n的生命周期已经结束了也就是原本存在n的地址就会被释放,该地址就已经不存在了,这时候指向这个地址的指针就变成了野指针,野指针很容易奔溃,或者乱指向已经被被使用的地址,这样操作是不被允许的;

声明在代码块内的变量都是自动变量,也就是比如在代码块内定义的int类型,其实是 auto int类型,只不过可以省略;但是有时候就是需要一种变量来让他可以用到各个代码块里,这时候就有了另一种变量叫做静态变量,它的生命周期是在程序启动时创建,程序结束时销毁,也就是它的生命周期存在于整个文件。而且,静态变量除了有这个优点外,如果没有给变量赋值的话,就会自动赋值为零,数组也是;当然,在代码块外的任何变量都是静态存储类型的变量,且代码块的静态存储变量具有文件作用域,即在变量声明开始,到程序结束;

#include<stdio.h>
int n=10;
int main()
{
	printf("%d",n);
}

当然,如果想要在代码块内定义静态变量也不是不可以在定义的类型上面加一个static(它的意思是静止的),这时候它的作用域仅在它声明时开始,到代码块结束时结束;

#include<stdio.h>
int* aaa()
{
	static int n = 10;
	int* p = &n;
	return p;

}
int main()
{
	int* h = aaa();
	printf("%d", *h);
	return 0;
}

这样写就是对的,也就是说这个n的生命周期是整个文件作用域,在代码块结束时虽然它的作用域结束,但是还存在,所以这时候它的地址也还在,所以可以这么操作; 

而且,在代码外的变量如果也加了这个的话就可以以表示拒绝介入其他文件中,只在本文件有效(这样做的原因是为了在其他文件中用同样的变量但是不被重复定义):先看分别在三个文件的代码:

 

 这里除了要打印人员函数外,主要是要看在两个文件里面分别定义了一个n,然后在主函数里面想打印主函数里的n,再用printPerson函数人员表的函数定义里的n打印出来;然后就会报错,错误是:

这是因为,文件作用域静态变量(也就是在代码块外的静态变量)也称为全局变量,多个源文件中不允许出现同名全局变量,这时候可以把把他们其中一个面前加一个extern(意为外部),并且去掉加了这个的赋值;这时候就可以了,也就是所有文件共享一个n,这时候打印的结果当然都是那个赋了的值;也就是说,如果我把主函数里面的int n=123;改为extern int n;这时候答应的就是另一个文件里面的456;

当然,如果我就是想按照原需求,打印不同的n怎么办呢,这时候就可以用到static,把它加到两个n的声明前面,这时候就行了;加了这个表示拒绝和其他文件共享本文件中的变量

总结:作用域的大小和在代码块还是代码内有关,而生命周期和变量的存储类型有关,并不是所有的静态变量都叫全局变量;

---------------------------------------------------------------------------------------------------------------------------------

就算星星碎掉了溢出来的光也很好看。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在程序里面执行system(“cd /某个目录“),为什么路径切换不成功?

粉丝提问&#xff1a; 彭老师&#xff0c;问下&#xff0c;在程序里面执行system(“cd /某个目录”)&#xff0c;这样会切换不成功&#xff0c;为啥呢 实例代码&#xff1a; 粉丝的疑惑是明明第10行执行了cd /media操作&#xff0c; 为什么12行执行的pwd > test2.txt 结…

Unity InputField滑动条

InputField增加滑动条效果 类似图中效果 添加一个InputField组件 2 .添加一个Scrollbar放在InputField内 调整属性 调整InputFiled组件属性 需要将Scrollbal添加到InputField的scrollbar上 然后根据美术需求将位置进行调整&#xff0c;记得InputFiled下的Text不要被Scr…

【浓缩概率】浓缩概率思想帮我蒙选择题的概率大大提升!

今天在学习的时候遇到一个很有趣的思想叫作浓缩概率&#xff0c;可以帮我们快速解决一下概率悖论问题&#xff01; 什么是概率 计算概率有下面两个最简单的原则&#xff1a; 原则一、计算概率一定要有一个参照系&#xff0c;称作「样本空间」&#xff0c;即随机事件可能出现…

Docker容器--Consul部署

Docker容器--Consul部署 一、简介1、概述2、Consul两种模式 二、Consul特性1、特性2、应用场景 三、部署Consul集群&#xff08;Server端&#xff09;1、建立Consul服务2、设置代理&#xff0c;在后台启动consul服务端3、查看集群信息 四、Consul部署&#xff08;Client端&…

第4章:运算符

1.算术运算符 ① SELECT 10010,100-35.5,100*2,100/2,100%30 FROM DUAL;②在sql中“”没有连接作用&#xff0c;表示加法运算&#xff0c;字符串转换为数值&#xff08;隐式转换&#xff09;。非数值看作0处理 SELECT 1001 1 FROM DUAL;SELECT 100 a FROM DUAL;③加法运算…

Trie Tree(字典树)例题

字典树. 又称单词查找树&#xff0c; Trie树 &#xff0c;是一种 树形结构 &#xff0c;是一种哈希树的变种。经常被搜索引擎系统用于文本词频统计。. 它的优点是&#xff1a;利用字符串的公共前缀来减少查询时间&#xff0c;最大限度地减少无谓的字符串比较&#xff0c;查询效…

Python 使用chatGPT帮忙写一个有序集类 OrderedSet

需求:需要实现一个有序的集合&#xff0c;像python普通集合一样&#xff0c;除了 它是有序的 我这边穿插着使用了gpt3.5和gpt4,发现确实还是gpt4好用&#xff0c;一分钱一分货啊 问&#xff1a;我的要求是这样&#xff0c;data是一个集合&#xff0c;往里面放了2&#xff0c;…

【大厂面试问题】:飞机绕行地球问题

你的阅读是我最大的动力 目录 你的阅读是我最大的动力 问题描述&#xff1a; 引出思路&#xff1a; 一台加油飞机 两台加油飞机 返航方案一&#xff1a;加油机I、II同时起飞。 返航方案二&#xff1a;加油机I先起飞加油机II再起飞 答案 不直接说答案&#xff0c;一步一…

14个WooCommerce商城网站必备插件

开始建立 WooCommerce 网站&#xff1f;您需要一个具有许多有助于吸引和留住客户的有用功能的网站。虽然基本的 WooCommerce 设置非常方便&#xff0c;但您可以通过使用有用的插件扩展 WooCommerce 来做更多的事情。 有数百个插件需要考虑&#xff0c;我们已经完成了研究&…

[C++初阶]栈和队列_优先级队列的模拟实现 deque类 的理解

为了更好的理解优先级队列priority_queue&#xff0c;这里会同时进行栈和队列的提及 文章目录 简要概念&#xff08;栈和队列&#xff09;栈和队列的模拟实现与使用stack&#xff08;栈&#xff09;deque的理解和操作queue priority_queue&#xff08;优先级队列&#xff09;框…

悲观锁、乐观锁、自旋锁和读写锁

悲观锁和乐观锁 悲观锁&#xff1a;在每次取数据时&#xff0c;总是担心数据会被其他线程修改&#xff0c;所以会在取数据前先加锁&#xff08;读锁&#xff0c;写锁&#xff0c;行 锁等&#xff09;&#xff0c;当其他线程想要访问数据时&#xff0c;被阻塞挂起。&#xff08…

金融贷款行业如何高效获客,积累意向客户群体——运营商大数据

现如今贷款行业面对的运营压力日益扩大&#xff0c;顾客贮备是生存的关键&#xff0c;传统式的陌生拜访&#xff0c;一切随缘销售市场已不能满足其要求。互联网消费行为的融合与转变是在销售市场端反映&#xff0c;直接影响着广告推广广告策略的确立与运用。 可是&#xff0c;…

移除元素【数组】

⭐前言⭐ ※※※大家好&#xff01;我是同学〖森〗&#xff0c;一名计算机爱好者&#xff0c;今天让我们进入练习模式。若有错误&#xff0c;请多多指教。更多有趣的代码请移步Gitee &#x1f44d; 点赞 ⭐ 收藏 &#x1f4dd;留言 都是我创作的最大的动力&#xff01; 题目 27…

IPEmotion 2023 R1支持在线能量分析

新发布的IPEmotion 2023 R1提供了许多新功能&#xff0c;其中最重要的是新的“在线功率计算&#xff08;Online Power Calculation&#xff09;”功能。该功能允许使用预定义的功率计算来进行测量任务和数据分析。此外&#xff0c;IPEmotion 2023 R1现在支持一种新的存储模式&a…

Maya英文界面怎么改为中文界面

Maya是一款3D动画和视觉效果软件&#xff0c;用于创建逼真的角色和大片般的效果&#xff0c;也是受到电影、电视和游戏行业的 3D 建模师、动画师、照明艺术家和 VFX 艺术家等多数人喜爱的一款3D软件。我们在使用Maya的过程中&#xff0c;常常会遇到一些小阻碍&#xff0c;比如M…

【Python爬虫实战】你不必到处找数据,你完全可以自己爬之Python批量采集图虫网摄影师高清美照,听说~你喜欢御姐...(爬图神器)

前言 怎么批量保存网页图片&#xff1f; 有时候在网页中看到很多美图其中有很多自己喜欢的图片素材或壁纸&#xff0c;一张纸一张下载保存未 免太低效了。 所有文章完整的素材源码都在&#x1f447;&#x1f447; 粉丝白嫖源码福利&#xff0c;请移步至CSDN社区或文末公众ha…

C++哈希应用——位图布隆过滤器

C布隆过滤器 文章目录 C布隆过滤器概念实质用途控制误判率实现插入和查找布隆过滤器的删除 布隆过滤器优点布隆过滤器缺陷相关大数据题目 用哈希表存储用户记录&#xff0c;缺点是需要消耗较大的内存&#xff1b;用位图存储用户记录&#xff0c;缺点是位图一般处理整形&#xf…

P1039 [NOIP2003 提高组] 侦探推理

题目描述 明明同学最近迷上了侦探漫画《柯南》并沉醉于推理游戏之中&#xff0c;于是他召集了一群同学玩推理游戏。游戏的内容是这样的&#xff0c;明明的同学们先商量好由其中的一个人充当罪犯&#xff08;在明明不知情的情况下&#xff09;&#xff0c;明明的任务就是找出这…

Java-设计模式中事件与委托Java版本

目录 背景介绍 实现过程 类图 NS图 代码 客户端 业务封装类 委托类 事件类 猫类 老鼠类 运行结果 总结提升 背景介绍 相信大家在学习大话设计模式的时候都有接触过事件与委托&#xff0c;但是对于事件与委托具体的业务逻辑也不是很清楚&#xff0c;只能照猫画虎去使用…

SEO机制算是让我玩明白了

获取当前时间时间戳&#xff0c;返回遵循ISO 8601扩展格式的日期 new Date(Date.now()).toISOString() 使用moment库转换回来 this.moment(new Date(Date.now()).toISOString()).format("YYYY-MM-DD") js去掉富文本中html标签和图片 filterHtmlTag(val) {if(!val){…