商务服务
static和const的作用与区别
2024-11-22 21:36

const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间。

static和const的作用与区别

我们先来说static.

 

static主要有三个作用

1.修饰局部变量,成为静态局部变量

2.修饰全局变量,成为静态全局变量

3.修饰函数,成为静态函数

我们一个一个来解释.

1.修饰局部变量。成为静态局部变量

我们先来看下面这一段程序

 

输出结果是多少呢

我们看到主函数一个循环是循环10次test函数,然后每执行一次test,都会打印一次a,a从6开始每次都+1(因为a++在前面,所以从6开始).

所以结果应该是6 7 8 9 10 11 12 13 14 15

那结果是不是如我们所想的呢

我们来看一下运行结果

这...?好像不符合我们的猜想诶。

为什么会出现10个6呢

我们仔细想一下,便可以大致知道问题所在。

就是每一次进入循环的时候a都被重置了,所以不会一直加下去。

这是为什么呢

因为a是我们所创建的一个临时变量,它会随着函数的结束而被销毁,下次再进来时,会被重新创建。

所以会造成我们刚才那种结果。

那我们就要输出那样6-15这样的结果该怎么做呢

我们可以在test函数里面int前面加上一个static

这样可以让这个局部变量随着函数的结束而不会被销毁,原理稍后会解释的

改成如下

 

这样我们再运行一次,来看看结果吧

符合我们的猜想了。

那具体为什么是这样呢?这里就要说到数据在内存中存储的三个区域

栈区   堆区  静态区

栈区:存放局部变量和函数参数等的地方。栈区的作用范围过了之后会自动回收栈区分配的内存,不需要手动管理。

堆区:由比如malloc,realloc等函数所主动申请的内存,使用完之后须用free释放内存,若申请完之后忘记释放内存,则很容易造成内存泄漏。

静态区:静态变量和全局变量所存储的区域,一旦静态区的内存被分配,直到程序全部结束之后才会被释放。

静态区这个换而言之静态区的生命周期和程序的生命周期是一样的,出了作用范围不会被销毁(上面static int a =5)这个例子,相当于作用范围不变,但生命周期延长了。

那么上面那个例子我们也可以进行解释原理了

static修饰局部变量时,实际改变的是变量的存储位置,原来在栈区,被修饰后放在了静态区。

所以说除了作用范围之后不会被销毁。

2.static修饰全局变量

现在vs编译器里面创建两个源文件:test1.cpp,test2.cpp

我们首先在文件test1.cpp里面创建一个全局变量,如下

 

 紧接着,我们知道引用别的文件里的全局变量需要extern这个函数,所以我们再test2.cpp这个文件里引用一下这个全局变量。

下面看输出结果

 

 完美的输出了外部的文件。

但是如果我们再test1.cpp里面的全局变量前面加上static,我们可以看一下程序能否成功运行。

我们运行这段程序

 

程序出错了.

我们看错误原因:无法解析的外部符号。

这是为什么啊,我们明明已经用了extern这个函数来调用外部文件里的那个全局变量了啊,为什么无法解析呢

 

 那肯定是static捣的鬼嘛,它在这里发挥了什么作用呢

一个全局变量本来是具有外部属性的,但是被static修饰后,外部属性就变成了内部连接属性,只能在自己所在的源文件内使用,不能在其他文件内使用。

这样呢,被static修饰后的全局变量给我们的感觉是作用域变小了(只能在自己文件内部使用,不能在别的文件内使用,但实质是链接属性变了。

3.static修饰函数

这个和那个修饰全局变量的类似。

还是创建两个源文件test1.c、test2.c。(此时文件名后缀为.c,不是.cpp,在c++环境中无法看到这种效果

我们在test1.cpp文件里写如下的段程序

 

 紧接着我们在test2.c里面写Add函数内容。

 

结果

 完美的输出了我们想要的结果。

但如果我们在test2.c里面的Add函数里面加上static

再次运行 :

发生错误。

错误原因也是无法解析的外部符号。

错误呢,和上个修饰全局变量一样

 一个函数本来是具有外部连接属性的,但是被static修饰后,外部链接属性就变成了内部连接属性,只能在自己所在的源文件内部使用,不能在其他文件内部使用了。

再来说一下const

如果把const放在变量类型名前,说明这个变量的值是保持不变的,该变量必须在定义时初始化,初始化后对它进行的任何赋值都是非法的。

1.const修饰常变量 例如

int a=5

a=6

此时a的值被修改为6。

const int a=5

 此时变量a的值便可再被修改

若仍写a=6,则程序便会出现错误。

2.const修饰常量静态字符串

例如

const char* str="fdsafdsa";

如果没有const的修饰,我们可能会在后面有意无意的写str[4]=’x’这样的语句,这样会导致对只读内存区域的赋值,然后程序会立刻异常终止。有了const,这个错误就能在程序被编译的时候就立即检查出来,这就是const的好处。让逻辑错误在编译期被发现。

3.修饰函数的参数

直接举例子说明

1.防止指针修改指针指向的内容内容

我们写以下函数

void String(char* str1,const char* arr2);

这个时候我们可以在String这个函数里面修改arr1内容,但是如果修改arr2程序便会报错,此时arr2不可再被修改。

2.防止指针修改指针指向的地址

void Swap(int* const p1,int* const p2);

此时p1和p2指向的地址便不可再被修改。

    以上就是本篇文章【static和const的作用与区别】的全部内容了,欢迎阅览 ! 文章地址:http://lanlanwork.gawce.com/news/9941.html 
     资讯      企业新闻      行情      企业黄页      同类资讯      首页      网站地图      返回首页 阁恬下移动站 http://lanlanwork.gawce.com/mobile/ , 查看更多   
最新新闻
健康消费加速向“新” 市场前景广阔
近年来,我国居民健康意识明显增强,健康消费潜力巨大,呈现出市场规模快速增长、业态模式不断创新、消费结构持续优化等特点。健
scratch编程少儿版电脑版 1.5.8官方版scratch手机版下载「scratch编程少儿版电脑版 1.5.8官方版」
scratch编程少儿版电脑版是一款专门针对广大青少年儿童推出的教育类编程软件。scratch编程少儿版电脑版采用Html5页面技术和JS语
【慎入女性手机「【慎入」
                ♛研青专属,他人使用请留言【半夜,空调开着,你躺在床上裹紧被子翻看着手机,时不时笑几声,突然一
从脚步声到“吱吱盒”,拟音师的孤独与热爱|影视
文|财新 邓舒方拟音棚内部分道具。图:受访者提供随着《哪吒之魔童闹海》热映,拟音师这一幕后职业也逐渐走进大众视野。曾参与
波杰抢戏詹库对决:28+8+8三分连创新高 末节决胜三分价值千金
北京时间4月4日,勇士以123-116击败湖人拿到四连胜。这场比赛波杰姆斯基抢戏了VS大小王之战,波杰上半场22分最高,全场比赛28分+
上市险企推动业务结构转型:分红险占比提升助力降低刚性负债成本
随着保险行业步入转型期,上市险企纷纷调整业务结构,大力推动分红险业务发展。根据最新数据,2025年以来,保险行业新备案的185
笔记本热点手机连不上一直正在连接-笔记本开热点手机连不上电脑连不上手机热点怎么回事「笔记本热点手机连不上一直正在连接-笔记本开热点手机连不上」
嗨,朋友们好!今天给各位分享的是关于笔记本开热点手机连不上的详细解答内容,本文将提供全面的知识点,希望能够帮到你!3、可
华为手机有电自动关机是怎么回事华为手机自动关机「华为手机有电自动关机是怎么回事」
山和水不是反义词。“山”的意思:1、地面形成的高耸的部分:土山。2、形状像山的:山墙(人字形房屋两侧的墙壁。亦称“房山”)
如何免费获取Windows10激活密钥?Win10统用激活码推荐 附激活工具windows10手机版「如何免费获取Windows10激活密钥?Win10统用激活码推荐 附激活工具」
Windows10专业版/企业版激活密钥/神key分享!win10专业版和企业版都不是免费使用的,需要我们使用产品密钥来激活,如果没有激活
计算机硬盘内存不足,电脑提示磁盘空间不足怎么办手机磁盘空间不足怎么清理「计算机硬盘内存不足,电脑提示磁盘空间不足怎么办」
使用电脑偶尔会遇到“磁盘空间不足”的提示,导致我们无法继续安装或运行程序,那么电脑提示磁盘空间不足怎么办呢?