C语言局部变量和全局变量的用法(附带实例)
C语言中,在函数内部定义的变量是局部变量,它的作用域是局部的,仅限在函数体内;在所有函数外部定义的变量是全局变量,它的作用域是整个程序。
函数的形式参数也属于局部变量,作用范围仅限于函数内部的所有语句块。
下图表示的是不同情况下局部变量的作用域范围:

图 1 局部变量的作用域范围
在语句块内声明的变量仅在该语句块内部起作用,当然也包括嵌套在其中的子语句块。
【实例】某米线店推出如下套餐:考神套餐 13 元,单身套餐 9.9 元,情侣套餐 20 元。本实例在不同的位置定义一些变量,并为其赋值来表示变量的所在位置,最后输出显示其变量值,通过输出的信息来观察局部变量的作用范围。
局部变量的作用范围由包含该变量的一对大括号所限定,据此可以更好地观察出局部变量的作用域。运行程序,输出结果为:
如果内层作用域中定义的变量和已经声明的某个外层作用域中的变量有相同名称,在内层中使用这个变量名,此时的变量名表示的是外层变量还是内层变量呢?答案是,内层作用域中的变量将屏蔽外层作用域中的同名变量,直到结束内层作用域为止。这就是局部变量的屏蔽作用。
【实例】局部变量的屏蔽作用。在本实例中,在不同的语句块内定义了 3 个相同名称的变量,通过输出的变量值来感受局部变量的屏蔽作用效果。
使用 if 语句进行判断,这里使用 if 语句的目的在于划分出一段语句块。因为位于不同作用域的变量可以使用相同的标识符,所以在 if 语句块中也定义一个 iNumber1 变量,并将其赋值为 2。再次使用 printf() 函数输出变量 iNumber1 的操作,观察一下程序的运行结果,发现输出的值为 2。说明值为 2 的 iNumber1 在此作用域中将值为 1 的 iNumber1 屏蔽掉了。
在 if 语句中再次进行嵌套,其嵌套语句中定义第 3 个相同的标识符 iNumber1 变量。为了进行区分,将其赋值为 3。调用 printf() 函数输出变量 iNumber1,从程序运行的结果可以看出显示结果为 3。说明值为 3 的 iNumber1 将值为 2 与 1 的两个 iNumber1 都进行了屏蔽。
在最深层嵌套的 if 语句结束之后,使用 printf() 函数进行输出,发现此时显示的值为 2。说明此时已经不在值为 3 的 iNumber1 作用域范围内,而在值为 2 的 iNumber1 作用域范围。
当 if 语句结束之后,再次输出 iNumber1 值,此时显示结果为 1,说明已离开了值为 2 的 iNumber1 的作用域范围,不再对值为 1 的 iNumber1 产生屏蔽作用。
运行程序,输出结果为:
例如,有一家全国连锁商店,其商品价格是全国统一的。全国各地有很多这样的连锁商店,当进行价格调整时,应该确保每一家连锁商店的价格是相同的。全局变量就像其中所要设定的价格,而函数就像每一家连锁店,当全局变量进行修改时,函数中使用的该变量都将同步被更改。
【实例】模拟连锁超市价格调整。在本程序中,使用全局变量模拟连锁店的全国价格调整,使用函数表示连锁店,并在函数中输出一条消息,表示连锁店中的价格。
在主函数 main() 中,首先将 3 家连锁店的初始价格进行显示,之后通过一条信息提示更改 iGlobalPrice 变量。全局变量被修改后,再次输出将所有连锁店的当前价格。
程序的输出结果为:
C语言局部变量
在函数内部定义的变量是局部变量。大家看到的 C语言实例程序中,绝大多数变量都只是局部变量,这些变量声明在函数内部,无法被其他函数所使用。函数的形式参数也属于局部变量,作用范围仅限于函数内部的所有语句块。
下图表示的是不同情况下局部变量的作用域范围:

图 1 局部变量的作用域范围
在语句块内声明的变量仅在该语句块内部起作用,当然也包括嵌套在其中的子语句块。
【实例】某米线店推出如下套餐:考神套餐 13 元,单身套餐 9.9 元,情侣套餐 20 元。本实例在不同的位置定义一些变量,并为其赋值来表示变量的所在位置,最后输出显示其变量值,通过输出的信息来观察局部变量的作用范围。
#include<stdio.h> /* 包含头文件 */ int main() /* 主函数 main */ { int iNumber1, iNumber2, iNumber3; /* 定义变量 */ printf("米线店套餐如下:1:考神套餐 2:单身套餐 3:情侣套餐\n"); printf("请选择套餐:"); scanf("%d", &iNumber1); /* 获取用户输入 */ if(iNumber1==1) { printf("考神套餐 13 元\n"); printf("请选择套餐:"); scanf("%d", &iNumber2); if(iNumber2==2) { printf("单身套餐 9.9 元\n"); printf("请选择套餐:"); scanf("%d", &iNumber3); if(iNumber3==3) { printf("情侣套餐 20 元\n"); } } } return 0; }程序中有 3 个作用域范围,主函数 main() 是其中最大的作用域范围:
- 因为变量 iNumber1 定义在 main() 函数中,所以 iNumber1 的作用范围是整个 main() 函数体;
- iNumber2 定义在第一个 if 语句块中,因此它的使用范围就是在第一个 if 语句块内;
- 变量 iNumber3 在最内部的嵌套层,因此使用范围只在最里面的 if 语句块中。
局部变量的作用范围由包含该变量的一对大括号所限定,据此可以更好地观察出局部变量的作用域。运行程序,输出结果为:
米线店套餐如下:1:考神套餐 2:单身套餐 3:情侣套餐 请选择套餐:1 考神套餐 13 元 请选择套餐:2 单身套餐 9.9 元 请选择套餐:3 情侣套餐 20 元C语言中,位于不同作用域的变量可以使用相同的标识符,也就是变量名可以相同。
如果内层作用域中定义的变量和已经声明的某个外层作用域中的变量有相同名称,在内层中使用这个变量名,此时的变量名表示的是外层变量还是内层变量呢?答案是,内层作用域中的变量将屏蔽外层作用域中的同名变量,直到结束内层作用域为止。这就是局部变量的屏蔽作用。
【实例】局部变量的屏蔽作用。在本实例中,在不同的语句块内定义了 3 个相同名称的变量,通过输出的变量值来感受局部变量的屏蔽作用效果。
#include<stdio.h> int main() /* 主函数 main */ { int iNumber1=1; /* 定义第 1 个 iNumber1 变量 */ printf("%d\n",iNumber1); /* 输出第 1 个 iNumber1 的变量值 */ if(iNumber1>0) { int iNumber1=2; /* 定义第 2 个 iNumber1 变量 */ printf("%d\n",iNumber1); /* 输出第 2 个 iNumber1 的变量值 */ if(iNumber1>0) { int iNumber1=3; /* 定义第 3 个 iNumber1 变量 */ printf("%d\n",iNumber1); /* 输出第 3 个 iNumber1 的变量值 */ } printf("%d\n",iNumber1); /* 再次输出第 2 个 iNumber1 的变量值 */ } printf("%d\n",iNumber1); /* 再次输出第 1 个 iNumber1 的变量值 */ return 0; }在主函数 main() 中,定义了第一个整型变量 iNumber1,将其赋值为 1,然后使用 printf() 函数进行输出。可以看到,此时 iNumber1 的值为 1。
使用 if 语句进行判断,这里使用 if 语句的目的在于划分出一段语句块。因为位于不同作用域的变量可以使用相同的标识符,所以在 if 语句块中也定义一个 iNumber1 变量,并将其赋值为 2。再次使用 printf() 函数输出变量 iNumber1 的操作,观察一下程序的运行结果,发现输出的值为 2。说明值为 2 的 iNumber1 在此作用域中将值为 1 的 iNumber1 屏蔽掉了。
在 if 语句中再次进行嵌套,其嵌套语句中定义第 3 个相同的标识符 iNumber1 变量。为了进行区分,将其赋值为 3。调用 printf() 函数输出变量 iNumber1,从程序运行的结果可以看出显示结果为 3。说明值为 3 的 iNumber1 将值为 2 与 1 的两个 iNumber1 都进行了屏蔽。
在最深层嵌套的 if 语句结束之后,使用 printf() 函数进行输出,发现此时显示的值为 2。说明此时已经不在值为 3 的 iNumber1 作用域范围内,而在值为 2 的 iNumber1 作用域范围。
当 if 语句结束之后,再次输出 iNumber1 值,此时显示结果为 1,说明已离开了值为 2 的 iNumber1 的作用域范围,不再对值为 1 的 iNumber1 产生屏蔽作用。
运行程序,输出结果为:
1 2 3 2 1
C语言全局变量
函数中定义的变量都是局部变量。如果一个变量在所有函数外部声明,这个变量就是全局变量。顾名思义,全局变量可以在程序的任何位置进行访问。全局变量可增加函数间的数据联系。同一文件中的所有函数都能引用全局变量的值,因此如果在一个函数中改变了全局变量的值,就能影响到其他函数,相当于各个函数间有了一个直接传递通道。注意,全局变量不属于某个函数,而属于整个源文件。如果外部文件要访问它,则要用 extern 关键字进行引用修饰。
例如,有一家全国连锁商店,其商品价格是全国统一的。全国各地有很多这样的连锁商店,当进行价格调整时,应该确保每一家连锁商店的价格是相同的。全局变量就像其中所要设定的价格,而函数就像每一家连锁店,当全局变量进行修改时,函数中使用的该变量都将同步被更改。
【实例】模拟连锁超市价格调整。在本程序中,使用全局变量模拟连锁店的全国价格调整,使用函数表示连锁店,并在函数中输出一条消息,表示连锁店中的价格。
#include<stdio.h> int iGlobalPrice=100; /* 设置商品的初始价格 */ void Store1Price(); /* 声明 4 个函数 */ void Store2Price(); void Store3Price(); void ChangePrice(); int main() { printf("原价格:%d\n",iGlobalPrice); /* 先显示价格改变之前所有连锁店的价格 */ Store1Price(); /* 显示 1 号连锁店的价格 */ Store2Price(); /* 显示 2 号连锁店的价格 */ Store3Price(); /* 显示 3 号连锁店的价格 */ ChangePrice(); /* 调用函数,改变连锁店的价格 */ printf("修改的价格是:%d\n",iGlobalPrice); /* 给出提示,显示修改后的价格 */ Store1Price(); /* 显示 1 号连锁店的当前价格 */ Store2Price(); /* 显示 2 号连锁店的当前价格 */ Store3Price(); /* 显示 3 号连锁店的当前价格 */ return 0; } void Store1Price() /* 定义 1 号连锁店的价格函数 */ { printf("1 号连锁店的价格:%d\n",iGlobalPrice); } void Store2Price() /* 定义 2 号连锁店的价格函数 */ { printf("2 号连锁店的价格:%d\n",iGlobalPrice); } void Store3Price() /* 定义 3 号连锁店的价格函数 */ { printf("3 号连锁店的价格:%d\n",iGlobalPrice); } void ChangePrice() /* 定义更改连锁店价格的函数 */ { printf("您想要改价格吗?如果是,改的价格是:"); scanf("%d",&iGlobalPrice); }在程序中,定义了一个全局变量 iGlobalPrice 来表示全国连锁店的初始商品价格,为了可以形成对比,初始化值为 100。还定义了 4 个函数,其中 3 个代表连锁店的价格,例如 Store1Price 代表 1 号连锁店;ChangPrice() 函数用来改变全局变量的值,代表对所有连锁店进行调价。
在主函数 main() 中,首先将 3 家连锁店的初始价格进行显示,之后通过一条信息提示更改 iGlobalPrice 变量。全局变量被修改后,再次输出将所有连锁店的当前价格。
程序的输出结果为:
原价格:100 1 号连锁店的价格:100 2 号连锁店的价格:100 3 号连锁店的价格:100 您想要改价格吗?如果是,改的价格是:150 修改的价格是:150 1 号连锁店的价格:150 2 号连锁店的价格:150 3 号连锁店的价格:150通过程序的运行结果可以看出,全局变量成为函数间数据联系的渠道,修改一个全局变量后,所有函数中的该变量都会发生改变。