网站首页 > 文章精选 正文
引言:
我们知道我们在定义变量的时候,一般都是在函数内部定义,那么当我们在重新定义一个函数的时候,这个变量就不能用了。那么,如何我们在函数之前定义变量会有什么结果呢?这就是变量的作用域问题,所以,今天这就是我们要说的。
局部变量
定义变量一般有三种形式:
- 在函数的开头定义
- 在函数的外部定义
- 在复合语句中定义
其中在函数的开头和在复合语句中定义的时候,只能在函数内部和该复合语句中使用,像这种变量称为局部变量。 例如:
fun 1 (int a, int b)
{ int x
}
fun 2(int c, int d)
{
c=x ; // 错误,因为在fun1函数定义的变量在fun2中将无法使用。
}
说明:
(1)主函数中定义的变量(如m,n)也只在主函数中有效,并不因为在主函数中定义而在整个文件或程序中有效。主函数也不能使用其他函数中定义的变量。
(2)不同函数中可以使用同名的变量,它们代表不同的对象;互不干扰。例如,上面在f1函数中定义了变量x,倘若在f2函数中也定义变量x,它们在内存中占不同的单元,互不混淆。
(3)形式参数也是局部变量。例如上面f1函数中的形参a,也只在f1函数中有效。其他函数可以调用f1 函数,但不能直接引用f1函数的形参a(例如在其他函数中输出a的值是不行的)。
(4)在一个函数内部,可以在复合语句中定义变量,这些变量只在本复合语句中有效,这种复合语句也称为“分程序”或“程序块”。
int main ()
{ int a,b;
{ int c;
c=a+b; // c在此复合语句内有效a,b在此范围内有效
}
变量c只在复合语句(分程序)内有效,离开该复合语句该变量就无效,系统会把它占用的内存单元释放。
全局变量:
我们知道程序的编译单位是源程序文件,而一个源程序可以包含若干个函数。在函数内部定义的变量称为局部变量,在函数外部定义的变量成为全局变量,也叫全程比变量。 全局变量可以为其他函数所使用,他的作用域是从定义到源文件的的结束。
例如:
#include <stdio.h>
int a=1,b=2;
void fun (void )
{
pritnf ("%d %d",a,b);
}
int main ()
{
printf (“%d %d”,a,b);
retuen 0;
}
输出结果是: 1 2 1 2
注意:
为了区分局部变量和全局变量,我们通常将全局变量的第一个字母大写。
但是问题来,当我们定义了全局变量之后,又在一个函数中,定义了同名得到变量,那么这个变量的值会是多少呢?是等于全局变量还是等于局部变量呢?
我们看如下程序:
#include <stdio.h>
int a=1 ,b=2;
int main ()
{
int a=5;
printf ("%d",a);
}
运行结果: 5
所以,我们可以看出,当全局变量和局部变量相同的时候,局部变量起作用。
变量的存储方式和生存期:
我们从以上得知,有的变量是始终存在的,而有的变量是临时存在的,只有函数使用到的时候,才会被临时分配存储单元,但是一旦函数结束,储存单元将被释放,变量不在存在。因此,我们可以说,变量的存储方式分为两种: 动态存储方式和静态存储方式。
内存中可供用户使用的存储空间可以分为三部分:
- 程序区
- 动态存储区
- 静态存储区
其中全局变量存储在静态存储区,从程序开始分配内存空间,到程序结束释放内存空间。 而在动态存储区存放一下数据:
- 函数的形式参数,在调用函数的时候给形式参数分配存储空间
- 自动变量,就是没有用static 修饰的变量。
- 函数的返回值。
以上的这些值都是动态分配存储空间的,每次调用到他们的时候,就临时分配存储空间,当使用完就释放,一次在同一个程序中,利用两次动态变量,它的内存地址也可能不同。
其实,当我们在定义函数和变量的时候,应该声明数据类型和存储类别。 数据类型就是整形,浮点型等,那存储类别又有什么呢?
C语言的存储类别有四种:
- 自动变量 (auto 变量)
- 静态局部变量 (static 变量)
- 寄存器变量 (re'gister 变量)
- 外部变量 (extern 变量)
auto 变量:
我们在定义 int a ;的时候,实际上就是: auto int a ;
static 变量:
例如一下程序:
#include <strdio.h>
int add (int a)
{
int c= 3;
c= c+1;
return a+c
}
int main ()
{
}
我们可以看到当我们每次调用add函数的时候,c的值又会初始化到3,c=c+1的赋值语句,只在本次调用起作用,所以我们在这也能看出来c是动态分配的。
但是我们在对比一下程序:
#include <stdio.h>
int add (int a)
{
static int c= 3;
c= c+1;
return a+c;
}
int main ()
{ int a=1;
printf ("%d",add(a));
}
这里就能看出static变量的区别了。
register 变量
又叫寄存器变量,计算机在进行计算的时候,通常要从外部取数据,那为了提高执行效率,我们可以将变量存放在寄存器也就是在CPU的寄存器中。当程序执行的数据特别多的时候,我们能够看出明显的区别。
猜你喜欢
- 2025-05-02 利用Axure+js创建可配置地图页面(axure做地图)
- 2025-05-02 JVM性能调优(1)——JVM内存模型和类加载运行机制
- 2025-05-02 C++变量作用域(c++变量的作用)
- 2025-05-02 成员变量、局部变量、静态变量(什么是成员变量和局部变量,以及它们的区别有哪些)
- 2025-05-02 C++|带析构语义的类的异常处理:抛出异常、栈展开、自动析构
- 2025-05-02 C++_程序内存模型_内存四区_代码区_全局区
- 2025-05-02 「设计模式」10分钟学懂UML类图(uml类图设计模式有哪些)
- 2025-05-02 罗克韦尔(AB)PLC讲解,用户自定义指令(AOI)详解
- 2025-05-02 内部疯传,22个必考C++面试知识点总结(附答案解析)
- 2025-05-02 从零开始学习C语言丨全局和局部的作用域、变量
- 06-18技术分享 | Web自动化之Selenium安装
- 06-18postman系列之批量执行接口测试用例
- 06-18Junit5 架构、新特性及基本使用(常用注解与套件执行)
- 06-18「技术分享」postman完整的接口测试
- 06-18HTTP接口测试工具Postman(接口测试url)
- 06-18postman--实现接口自动化测试(postman接口自动化框架)
- 06-18讲解LDO(讲解的近义词)
- 06-18震撼!2020国际摄影奖获奖佳作欣赏
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)