变量与函数(补充)

变量与函数(补充)在程序设计概念中 通常来说 段程序代码中所 到的名字并不总是有效 可 的 限定这个名字的可 性的代码范围就是这个名字的作 域

大家好,欢迎来到IT知识分享网。

一.变量的作用域.

作用域的定义:

在程序设计概念中,通常来说,⼀段程序代码中所⽤到的名字并不总是有效(可⽤)的,⽽限定这个名字的可⽤性的代码范围就是这个名字的作⽤域

1.1.局部变量(内部变量)

定义:在一个函数内部定义的变量.

局部变量的作⽤域是变量所在的局部范围
局部变量的作用域注意事项:
1.形参变量是属于被调函数的局部变量,而实参变量是属于主调函数的局部变量
2.允许在不同的函数中使用相同的变量名,但它们都代表了不同的对象,系统会把它们分开存放,他们彼此之间也不会发生混淆.
例如:
int f1(int a) { int b =0,c=0; return a+b-c; } int f2() { int b =0; return b; }

在此题中f1和f2中b是不同的变量,打个比方,就好像在中国有个叫张三,在其他国家也可能有一个叫张三的,但是两个已经不同的人了。、

3.主函数定义的变量只能在主函数中使用,不能在其他函数中使用,同样在主函数中也不能使用其他函数中定义的变量

4. C语言允许在复合语句中,其作用域只在复合语句范围内.

1.2.全局变量(外部变量)

定义:在函数外部定义的变量,它的有效范围是从该变量定义的位置直到源文件的结尾.

全局变量的作⽤域是整个⼯程(项⽬)
补充:

如果函数内部存在一个变量与全局变量是相同的名字,那么同名的局部变量就会在函数内部屏蔽全局变量的影响。

作用:全局变量最重要的一个作用就是允许多个函数都能对某一个变量进行修改

全局变量有以下缺点,非必要不建议使用:

1.外部函变量破坏了函数的独立性。函数不在以独立的形式来完成各自的功能,因为这些功能的实现将受制于外部因素,与结构化程序的设计思想是相违背的

2.全局变量在程序执行的过程中始终占用储存单元,这是不太经济的

二.变量的储存方式.

分类:

静态存储和动态存储

静态存储:

定义:静态变量在函数变量定义时就为其分配固定的组成单元,并一直保持不变,直至整个程序结束叫作静态存储

动态存储:

定义:动态储存是利用变量在程序的执行过程中,仅当需要生产临时性的分配储存单元,并且在使用完毕后,动态存储的变量也会被立即释放,当一个函数被多次掉,其中的局部变量就会反复的分配及释放储存空间

生命周期:由于变量的储存方式不同而产生的特性称为变量的生存周期

补充:

1.局部变量的⽣命周期是:进⼊作⽤域变量创建,⽣命周期开始,出作⽤域⽣命周期结束。
2.
 
全局变量的⽣命周期是:整个程序的⽣命周期。

生存周期和作用域就是从时间和空间这两个不同的维度对变量的存在特性进行的描述

变量与函数(补充)
C语言通过auto,static,register和extern这4个关键字对变量的存储形式进行说明。

三.四个关键词(auto,static,register和extern)

3.1.auto:

auto:自动变量,

自动变量采用的是动态储存方式,也就是说当函数被调用时,其中的自动变量才会被分配储存空间而且函数返回后临时储存空间也会被释放,例如未加储存类型的说明符的局部变量形参变量都是自动变量,在函数内定义的自动变量也可以与该函数内部的复合语句中一种定义的自动变量同名。只不过函数内部复合语句中定义的自动变量,将屏蔽函数中本来定义的同名局部变量

 C语言规定函数中未反加储存分类型说明的变量均视为自动变量

自动变量的作用域仅限于定义该变量的函数或者复合语句中
自动变量的生命周期仅限于函数调用的过程中,当函数返回后其声明周期结束

3.2.static

静态局部变量:

如果我们希望在函数内部的局部变量在函数调用结束后不消失而保留原值,也就是希望占用的储存单元不被释放,而在下一次函数调用中该变量有值。也就是上次函数调用结束的值,这时候就应该指定该局部变量为静态局部变量static,语言中规定关键词static为变量的静态局部变量,如果一个变量被声明为static,它就与静态储存方式分配储存单元

静态局部变量的特点:

1.在编译中赋值的,且只赋值一次。

2静态局部变量属于静态储存类别,在静态储存区内分配,储存单元在程序整个运行期间都不释放

3.如果局部变量不赋初始值,静态局部变量编译时会自动赋值初始值为0(数值型变量或对空字符变量)

4.静态局部变量在函数调用结束后仍然存在,但其他函数是不能调用它

5.静态局部变量可以很好的对其他函数隐藏该变量

static可修饰以下三种类型:

1.局部变量:

static修饰局部变量改变了变量的⽣命周期,⽣命周期改变的本质是改变了变量的存储类型,本来⼀个局部变量是存储在内存的栈区的,但是被 static
修饰后存储到了静态区。存储在静态区的变 量和全局变量是⼀样的,⽣命周期就和程序的⽣命周期⼀样了,只有程序结束,变量才销毁,内存才回收。但是作⽤域不变
使⽤建议:未来⼀个变量出了函数后,我们还想保留值,等下次进⼊函数继续使⽤,就可以使⽤static修饰

2.全局变量:

⼀个全局变量被static修饰,使得这个全局变量只能在本源⽂件内使⽤,不能在其他源⽂件内使⽤
解释:

全局变量默认是具有外部链接属性的,在外部的⽂件中想使⽤,只要适当的声明就可以使⽤;但是全局变量被 static
修饰之后,外部链接属性就变成了内部链接属性,只能在⾃⼰所在的源⽂件内部使⽤了,其他源⽂件,即使声明了,也是⽆法正常使⽤的。
使⽤建议:如果⼀个全局变量,只想在所在的源⽂件内部使⽤,不想被其他⽂件发现,就可以使⽤
static修饰

3.函数

⼀个函数在整个⼯程都可以使⽤,被static修饰后,只能在本⽂件内部使⽤,其他⽂件⽆法正常的链接使⽤了。
解释:
本质是因为函数默认是具有外部链接属性,使得函数在整个⼯程中只要适当的声明就可以被使⽤。但是被 static
修饰后变成了内部链接属性,使得函数只能在⾃⼰所在源⽂件内部使⽤。
使⽤建议:⼀个函数只想在所在的源⽂件内部使⽤,不想被其他源⽂件使⽤,就可以使⽤
static
饰。

static例子:

#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> void print() { static int num = 4;//静态局部变量 printf("%d ", num); num++; } int main() { for (int i = 0; i < 3; i++) { print(); } return 0; }

变量与函数(补充)

如果不加static,结果为4 4 4

3.3.register(寄存器变量)

(寄存器变量的声明在某种程度上是不需要的了,原因是因为编译器基本会识别出那些频繁使用的变量,并对这些变量把它放在寄存器中,因此,对于寄存器变量只需要大致了解即可)

介绍:变量一般情况都是储存在内存中,计算机的内存又称RAM,它是一种半导体储存器件, CPU会在内存中取值,然后做进一步处理,CPU从内存中取得变量之后,会将其暂时存放在寄存器中

寄存器就是CPU的小内存库,特点是容量小,速度快

关键字register来声明局部变量时,该变量器称为寄存器变量,寄存器变量的值会被存放在CPU寄存器中,每当需要使用时,CPU就可以直接使用,无需再从内存中获取,从而提高程序运行效率

例子:

#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int sum(int n) { register int s = 0; register int i = 0; for (i = 0; i <= n; i++) { s += i; } return s; } int main() { int ret = sum(2000); printf("sum(2000)=%d\n", ret); return 0; }

使用寄存器变量的注意事项:

1.不能定义任意多个寄存器变量,原因是不同体系系统的CPU通常的寄存器个数大约都在6~16个之间,总的来说,寄存器的数量是稀缺的,不能滥用

2.不同系统对寄存器并处理方式可能不同,有些系统只允许int,char,指针型变量,而有的系统则将寄存器变量当作自动变量

3.只有局部自动变量和形式参数才能定义为寄存器变量,全局变量和局部静态变量是不能定义为寄存器变量的,原因是全局变量和局部静态变量都是被放在静态储存区的,而寄存器变量是被放在寄存器中的

3.4.extern

关键字extern用来修饰外部变量的,它的作用是扩展外部变量的作用域,extern声明外部变量时,
类型标识符是可以省略的
关键字extern可以实现变量的跨文件访问;
使用关键字extern需谨慎,误用该关键字,那么会导致不同的文件或函数中的值就会产生
连带效应
编译器对关键字extenn的处理方式:
首先会在外部变量声明的地方开始在
本文件中查找
外部变量的定义,如果外部变量的定义在本文件中被找到,那么外部变量的作用域在本文件中进行。如果在文件中无法找到外部变量的定义,寄存器就会从工程的
其他文件中查找外部变量,如果此时被找到,该变量的作用域就会扩展到其他文件,但如果还没有找到编译器就会爆出错误
总而言之:

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

最后:希望文章对你有帮助,学习加油!!!

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/135856.html

(0)
上一篇 2025-07-01 18:26
下一篇 2025-07-01 18:33

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信