C 语言编程教程

C 语言 - 首页

C 语言基础

C 语言 - 概述 C 语言 - 特性 C 语言 - 发展历史 C 语言 - 环境设置 C 语言 - 程序结构 C 语言 - Hello World C - 编译过程 C - 注释 C - 标记 C - 关键字 C - 标识符 C - 用户输入 C - 基本语法 C - 数据类型 C - 变量 C - 整数提升 C - 类型转换 C - 类型转换 C - 布尔值

C 语言中的常量和文字

C - 常量 C - 字面量 C - 转义序列 C - 格式说明符

C 语言中的运算符

C - 运算符 C - 算术运算符 C - 关系运算符 C - 逻辑运算符 C - 位运算符 C - 赋值运算符 C - 一元运算符 C - 递增和递减运算符 C - 三元运算符 C - sizeof 运算符 C - 运算符优先级 C - 其他运算符

C 语言中的决策

C - 决策 C - if 语句 C - if...else 语句 C - 嵌套 if 语句 C - switch 语句 C - 嵌套 switch 语句

C 语言中的循环

C - 循环 C - While 循环 C - For 循环 C - Do...while 循环 C - 嵌套循环 C - 无限循环 C - Break 语句 C - Continue 语句 C - goto 语句

C 语言中的函数

C - 函数 C - Main 函数 C - 按值调用函数 C - 按引用调用函数 C - 嵌套函数 C - 可变参数函数 C - 用户定义函数 C - 回调函数 C - return 语句 C - 递归

C 语言中的作用域规则

C - 作用域规则 C - 静态变量 C - 全局变量

C 语言中的数组

C - 数组 C - 数组的属性 C - 多维数组 C - 将数组传递给函数 C - 从函数返回数组 C - 可变长度数组

C 语言中的指针

C - 指针 C - 指针和数组 C - 指针的应用 C - 指针运算 C - 指针数组 C - 指向指针的指针 C - 将指针传递给函数 C - 从函数返回指针 C - 函数指针 C - 指向数组的指针 C - 指向结构体的指针 C - 指针链 C - 指针 vs 数组 C - 字符指针和函数 C - NULL 指针 C - void 指针 C - 悬垂指针 C - 解引用指针 C - Near、Far 和 Huge 指针 C - 指针数组的初始化 C - 指针与多维数组

C 语言中的字符串

C - 字符串 C - 字符串数组 C - 特殊字符

C 语言的结构体和联合

C - 结构体 C - 结构体和函数 C - 结构体数组 C - 自引用结构 C - 查找表 C - 点 (.) 运算符 C - 枚举(或 enum) C - 结构填充和打包 C - 嵌套结构 C - 匿名结构和联合 C - 联合 C - Bit 位字段 C - Typedef

C 语言中的文件处理

C - 输入和输出 C - 文件 I/O(文件处理)

C 语言中的预处理器

C - 预处理器 C - #pragma 编译指示 C - 预处理器操作符 C - 宏 C - 头文件

C 语言中的内存管理

C - 内存管理 C - 内存地址 C - 存储类

C 其他主题

C - 错误处理 C - 可变参数 C - 命令执行 C - 数学函数 C - static 静态关键字 C - 随机数生成 C - 命令行参数

C 语言编程资源

C语言问题与解答答案 C语言快速指南 C语言速查表 C语言实用资源 C语言讨论


C - 作用域规则

任何编程中的作用域都是程序中的一个区域,定义的变量可以存在于该区域内,并且超出该区域的范围则无法访问该变量。在 C 编程语言中,变量可以在三个地方声明 -

  • 函数或代码块内部声明的变量称为局部变量。

  • 所有函数外部声明的变量称为全局变量。

  • 在函数参数的定义中声明的变量称为形式参数。

让我们了解一下什么是局部变量、全局变量,以及形式参数。

局部变量

在函数或代码块内部声明的变量称为局部变量。它们只能在该函数或代码块内的语句中使用。局部变量不为自身函数以外的函数所知。

示例

以下示例展示了如何使用局部变量。这里,所有变量 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
", 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
", a, b, g);
 
  return 0;
}

程序中的局部变量和全局变量可以同名,但函数内部局部变量的值优先。以下是示例 -

示例

#include <stdio.h>

/* 全局变量声明 */
int g = 20;
 
int main () {

  /*局部变量声明*/
  int g = 10;
 
  printf ("value of g = %d
",  g);
 
  return 0;
}

当编译并执行上述代码时,它会产生以下结果 -

value of g = 10

形式参数

形式参数在函数内被视为局部变量,其优先级高于全局变量。以下是示例:

示例

#include <stdio.h>

/* 全局变量声明 */
int a = 20;
 
int main () {

  /* 主函数中的局部变量声明 */
  int a = 10;
  int b = 20;
  int c = 0;

  printf ("value of a in main() = %d
",  a);
  c = sum( a, b);
  printf ("value of c in main() = %d
",  c);

  return 0;
}

/* 函数将两个整数相加 */
int sum(int a, int b) {

   printf ("value of a in sum() = %d
",  a);
   printf ("value of b in sum() = %d
",  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

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

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

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

正确初始化变量是一种很好的编程习惯,否则您的程序可能会产生意外的结果,因为未初始化的变量将占用其内存位置上已经存在的一些垃圾值。