程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

从零开始学习C语言丨全局和局部的作用域、变量

balukai 2025-05-02 16:36:20 文章精选 6 ℃

哈喽,各位朋友,大家好。最近寒潮来袭,大幅度降温,大家可要注意保暖了。

这篇文章就和大家来聊一聊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、未初始化的默认值也不同。

关于作用域以及变量一些扩展的内容就到这里结束了,希望能对大家有所帮助。文中有什么不当之处,还请大家不吝指出。

最近发表
标签列表