网站首页 > 文章精选 正文
哈喽,各位朋友,大家好。最近寒潮来袭,大幅度降温,大家可要注意保暖了。
这篇文章就和大家来聊一聊C语言中的作用域,了解什么是作用域,以及它有什么作用。
作用域
首先我们先把作用域这个词拆开了理解:
作用:发挥用处,能用。
域:表示有边界、有范围的地方。
合起来,作用域的意思就是在某个范围内,才能发挥作用。
一旦离开这个范围,就没有用处了。
打个比喻:在自己家里吹嘘,总统都是傻子,世界首富可以更有钱,爹妈也只能是遗憾地看着自家的傻儿子,不会直接赶出家门;如果跑到别人家吹嘘,还没进门,就会被人家乱棍打出。
在C语言当中,作用域主要是分成了两个:全局作用域和局部作用域。用来描述变量能起作用的范围。
局部作用域,就相当于是家里和别人家里。
全局作用域,相当于一个村子。村长可以到这家吹牛,也可以到那家吹牛,大家碍于身份,也不好赶人出去,只好是捏着鼻子听着。
村长则是相当于全局变量,可以到处去吹牛;而你只是一个局部变量,在自家就算了,跑到别人家,你就知道了什么是社会险恶。
全局作用域,又叫做文件作用域,也就是我们所编写的源文件(.c)就是一个全局作用域。
int a=1;
int main(){
int b=3, c;
c = a+b; // 4
}
在这个作用域里声明的变量,就叫做全局变量,它可以应用在文件中从声明之后的任意一个地方,可以是函数体里面,可以是循环里面,判断里面等等。
直到程序结束,才算是寿终正寝。
局部作用域,又被细分为块级作用域、函数作用域、函数原型作用域。
块级作用域,即用花括号 {...} 包裹起来的内容。如循环体、判断体、函数体。
for(int i=0;i<10;i++){
int a;
a = 1;
}
{...} 相当于孙悟空给唐僧画的圈圈,在圈里面你是绝对安全的,但是自己跳出去,那就是在作死了。
在代码块里面声明的变量也叫作局部变量,它的作用范围也仅限于这块代码中。当代码块运行结束,这个变量也将会被销毁。
想要在外面直接使用这个变量,是不能的。当然这也不是绝对,想要在外部使用局部变量,方法是有的,这里暂且不说,后面有用到再展开。
函数作用域,即从函数定义的形式参数开始,到函数结束这个范围内。
void swap(int a, int b){
int temp = a;
b = a;
a = temp;
}
函数原型作用域,就只有从声明的参数列表左括号开始,到右括号结束。
int add(int, int);
作用域限制了变量的使用范围,保证了变量使用的安全性。
从另一个角度上来说,提高了变量名的复用性,减少了我们去想不同变量名的烦恼。
全局和局部变量的区别
看完了作用域,接下来咱们看一下全局变量和局部变量有什么区别。
第一个区别,名称上的区别...全局和局部。
全局变量,即在全局作用域,所有代码块和函数之外声明的变量。生命周期是从变量声明开始,到程序结束。可以用在声明之后文件中的任何地方。
局部变量,即在局部作用域,函数中或者代码块中声明的变量。生命周期是从变量声明开始,到代码快结束或者函数结束。只能在声明的代码块或者函数中使用。
第二个区别,初始值的区别。
如果初始化了变量,但是没有进行初始化,那么编译器会给全局变量和局部变量一个什么样的值?
#include<stdio.h>
int a;
int main(){
int b;
printf("a的值为:%d\n", a);
printf("b的值为:%d\n", b);
return 0;
}
运行结果:
a的值为:0
b的值为:4194432
全局变量声明后未进行初始化,编译器会自动给变量赋值。int 就赋值 0;char 赋值 \0;指针类型,赋值一个 00000000。
局部变量声明后未进行初始化,编译器会随机给变量赋值,这个值是未知的,就会产生脏数据。
所以一般声明了普通的局部变量,建议是直接对其进行初始化。
总结
作用域:用来描述变量所能作用的范围。
作用域的分类:全局作用域和局部作用域。
全局作用域,即文件作用域,整个源文件(.c)都是作用域。
局部作用域,细分块级作用域、函数作用域、函数原型作用域。
变量的划分:全局变量和局部变量。
两者区别:1、声明位置,使用范围不同;2、未初始化的默认值也不同。
关于作用域以及变量一些扩展的内容就到这里结束了,希望能对大家有所帮助。文中有什么不当之处,还请大家不吝指出。
猜你喜欢
- 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语言基础编程—5年程序员给你讲函数,你真的懂函数吗?
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 稳压管的稳压区是工作在什么区 (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)