非常教程

C 教程教程

C 作用域规则

C 作用域规则

C 作用域规则

任何一种编程中,作用域是程序中定义的变量所存在的区域,超过该区域变量就不能被访问。C 语言中有三个地方可以声明变量:

  1. 在函数或块内部的局部变量
  2. 在所有函数外部的全局变量
  3. 形式参数的函数参数定义中

让我们来看看什么是局部变量、全局变量和形式参数。

局部变量

在某个函数或块的内部声明的变量称为局部变量。它们只能被该函数或该代码块内部的语句使用。局部变量在函数外部是不可知的。下面是使用局部变量的实例。在这里,所有的变量 a、b 和 c 是 main() 函数的局部变量。

实例

#include <stdio.h> int main () { /* 局部变量声明 */ int a, b; int c; /* 实际初始化 */ a = 10; b = 20; c = a + b; printf ("value of a = %d, b = %d and c = %d\n", a, b, c); return 0; }

全局变量

全局变量是定义在函数外部,通常是在程序的顶部。全局变量在整个程序生命周期内都是有效的,在任意的函数内部能访问全局变量。

全局变量可以被任何函数访问。也就是说,全局变量在声明后整个程序中都是可用的。下面是使用全局变量和局部变量的实例:

实例

#include <stdio.h> /* 全局变量声明 */ int g; int main () { /* 局部变量声明 */ int a, b; /* 实际初始化 */ a = 10; b = 20; g = a + b; printf ("value of a = %d, b = %d and g = %d\n", a, b, g); return 0; }

在程序中,局部变量和全局变量的名称可以相同,但是在函数内,如果两个名字相同,会使用局部变量值,全局变量不会被使用。下面是一个实例:

在程序中,局部变量和全局变量的

实例

#include <stdio.h> /* 全局变量声明 */ int g = 20; int main () { /* 局部变量声明 */ int g = 10; printf ("value of g = %d\n", g); return 0; }

当上面的代码被编译和执行时,它会产生下列结果:

value of g = 10

形式参数

函数的参数,形式参数,被当作该函数内的局部变量,如果与全局变量同名它们会优先使用。下面是一个实例:

实例

#include <stdio.h> /* 全局变量声明 */ int a = 20; int main () { /* 在主函数中的局部变量声明 */ int a = 10; int b = 20; int c = 0; int sum(int, int); printf ("value of a in main() = %d\n", a); c = sum( a, b); printf ("value of c in main() = %d\n", c); return 0; } /* 添加两个整数的函数 */ int sum(int a, int b) { printf ("value of a in sum() = %d\n", a); printf ("value of b in sum() = %d\n", b); return a + b; }

当上面的代码被编译和执行时,它会产生下列结果:

value of a in main() = 10
value of a in sum() = 10
value of b in sum() = 20
value of c in main() = 30

全局变量与局部变量在内存中的区别

  • 全局变量保存在内存的全局存储区中,占用静态的存储单元;
  • 局部变量保存在栈中,只有在所在函数被调用时才动态地为变量分配存储单元。

更多内容可参考:C/C++ 中 static 的用法全局变量与局部变量

初始化局部变量和全局变量

当局部变量被定义时,系统不会对其初始化,您必须自行对其初始化。定义全局变量时,系统会自动对其初始化,如下所示:

数据类型初始化默认值
int 0
char '\0'
float 0
double 0
pointer NULL

正确地初始化变量是一个良好的编程习惯,否则有时候程序可能会产生意想不到的结果,因为未初始化的变量会导致一些在内存位置中已经可用的垃圾值。

C 作用域规则
C 教程

C 语言是一种通用的、面向过程式的计算机程序设计语言,广泛用于系统与应用软件的开发。具有高效、灵活、功能丰富、表达力强和较高的可移植性等特点,在程序员中备受青睐。

C 教程目录

1.C 基本语法
2.C 程序结构
3.C 环境设置
4.C 简介
5.C 作用域规则
6.C 函数
7.C 运算符
8.C 存储类
9.C 常量
10.C 头文件
11.C 预处理器
12.C 文件读写
13.C 输入 & 输出
14.C typedef
15.C 位域
16.C 共用体
17.C 结构体
18.C 指针
19.C 命令行参数
20.C 内存管理
21.C 可变参数
22.C 错误处理
23.C do…while 循环
24.C for 循环
25.C while 循环
26.C 嵌套 switch 语句
27.C switch 语句
28.C 嵌套 if 语句
29.C if…else 语句
30.C if 语句
31.C 指向数组的指针
32.C 从函数返回数组
33.C 传递数组给函数
34.C 多维数组
35.C 引用方式调用函数
36.C 传值方式调用函数
37.C goto 语句
38.C continue 语句
39.C break 语句
40.C 嵌套循环
41.C 从函数返回指针
42.C 传递指针给函数
43.C 指向指针的指针
44.C 指针数组
45.C 指针的算术运算
46.C 标准库 – <limits.h>
47.C 标准库 – <setjmp.h>
48.C 标准库 – <float.h>
49.C 标准库 – <errno.h>
50.C 标准库 – <ctype.h>
51.C 标准库 – <assert.h>
52.C 标准库 – 参考手册
53.C 库宏 – assert()
54.C 标准库 – <time.h>
55.C 标准库 – <string.h>
56.C 标准库 – <stdlib.h>
57.C 标准库 – <stdio.h>
58.C 标准库 – <stddef.h>
59.C 标准库 – <stdarg.h>
60.C 标准库 – <signal.h>
61.C 标准库 – <math.h>
62.C 标准库 – <locale.h>
63.C 库函数 – isspace()
64.C 库函数 – ispunct()
65.C 库函数 – isprint()
66.C 库函数 – islower()
67.C 库函数 – isgraph()
68.C 库函数 – isdigit()
69.C 库函数 – iscntrl()
70.C 库函数 – isalpha()
71.C 库函数 – isalnum()
72.C 库函数 – setlocale()
73.C 库宏 – ERANGE
74.C 库宏 – EDOM
75.C 库宏 – errno
76.C 库函数 – toupper()
77.C 库函数 – tolower()
78.C 库函数 – isxdigit()
79.C 库函数 – isupper()
80.C 库函数 – tanh()
81.C 库函数 – sinh()
82.C 库函数 – sin()
83.C 库函数 – cosh()
84.C 库函数 – cos()
85.C 库函数 – atan2()
86.C 库函数 – atan()
87.C 库函数 – asin()
88.C 库函数 – acos()
89.C 库函数 – localeconv()
90.C 库函数 – fabs()
91.C 库函数 – ceil()
92.C 库函数 – sqrt()
93.C 库函数 – pow()
94.C 库函数 – modf()
95.C 库函数 – log10()
96.C 库函数 – log()
97.C 库函数 – ldexp()
98.C 库函数 – frexp()
99.C 库函数 – exp()
100.C 库函数 – fmod()