大家好,欢迎来到IT知识分享网。
一.变量的作用域.
作用域的定义:
1.1.局部变量(内部变量)
定义:在一个函数内部定义的变量.
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.全局变量在程序执行的过程中始终占用储存单元,这是不太经济的
二.变量的储存方式.
分类:
静态存储和动态存储
静态存储:
定义:静态变量在函数变量定义时就为其分配固定的组成单元,并一直保持不变,直至整个程序结束叫作静态存储
动态存储:
定义:动态储存是利用变量在程序的执行过程中,仅当需要生产临时性的分配储存单元,并且在使用完毕后,动态存储的变量也会被立即释放,当一个函数被多次掉,其中的局部变量就会反复的分配及释放储存空间
生命周期:由于变量的储存方式不同而产生的特性称为变量的生存周期
补充:
全局变量的⽣命周期是:整个程序的⽣命周期。
生存周期和作用域就是从时间和空间这两个不同的维度对变量的存在特性进行的描述
三.四个关键词(auto,static,register和extern)
3.1.auto:
auto:自动变量,
自动变量采用的是动态储存方式,也就是说当函数被调用时,其中的自动变量才会被分配储存空间而且函数返回后临时储存空间也会被释放,例如未加储存类型的说明符的局部变量和形参变量都是自动变量,在函数内定义的自动变量也可以与该函数内部的复合语句中一种定义的自动变量同名。只不过函数内部复合语句中定义的自动变量,将屏蔽函数中本来定义的同名局部变量
C语言规定函数中未反加储存分类型说明的变量均视为自动变量
3.2.static
静态局部变量:
如果我们希望在函数内部的局部变量在函数调用结束后不消失而保留原值,也就是希望占用的储存单元不被释放,而在下一次函数调用中该变量有值。也就是上次函数调用结束的值,这时候就应该指定该局部变量为静态局部变量static,语言中规定关键词static为变量的静态局部变量,如果一个变量被声明为static,它就与静态储存方式分配储存单元
静态局部变量的特点:
1.在编译中赋值的,且只赋值一次。
2静态局部变量属于静态储存类别,在静态储存区内分配,储存单元在程序整个运行期间都不释放
3.如果局部变量不赋初始值,静态局部变量编译时会自动赋值初始值为0(数值型变量或对空字符变量)
4.静态局部变量在函数调用结束后仍然存在,但其他函数是不能调用它
5.静态局部变量可以很好的对其他函数隐藏该变量
static可修饰以下三种类型:
1.局部变量:
修饰后存储到了静态区。存储在静态区的变 量和全局变量是⼀样的,⽣命周期就和程序的⽣命周期⼀样了,只有程序结束,变量才销毁,内存才回收。但是作⽤域不变的
2.全局变量:
修饰之后,外部链接属性就变成了内部链接属性,只能在⾃⼰所在的源⽂件内部使⽤了,其他源⽂件,即使声明了,也是⽆法正常使⽤的。
3.函数
修饰后变成了内部链接属性,使得函数只能在⾃⼰所在源⽂件内部使⽤。
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
类型标识符是可以省略的
连带效应
本文件中查找
外部变量的定义,如果外部变量的定义在本文件中被找到,那么外部变量的作用域在本文件中进行。如果在文件中无法找到外部变量的定义,寄存器就会从工程的
其他文件中查找外部变量,如果此时被找到,该变量的作用域就会扩展到其他文件,但如果还没有找到编译器就会爆出错误
进⾏声明,然后使⽤
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/135856.html