1.变量的作用域
作用域:变量在程序中的有效范围。
全局变量(外部变量):定义在所有函数外部,浪费内存单元。
局部变量(内部变量):定义在某函数或复合语句内部。
执行时优先级:局部变量>全局变量
2.变量的存储
① 存储空间
- 程序区(代码):可执行机器指令
- 静态存储区(数据):需占用固定存储单元的变量
- 动态存储区(数据):不需占用固定存储单元的变量
② 变量类型
- 动态存储变量(自动类变量)
- 静态存储变量
③ 存储类别
- auto(动态存储类别)
- extern(外部存储类别)
- register(寄存器型存储类别)
- static(静态存储类别)
④ 局部变量存储类别
// ① auto型 (自动变量,默认)
auto int a,b;
int a,b;
// ② static型 (保留值,只能定义一次)
static int a,b;
// ③ register型 (仅动态局部变量,尽量少用)
register int a,b;
⑤ 全局变量存储类别
// ① extern型 (全局声明,可在多个文件中调用,默认)
extern int a,b;
// ② static型 (仅限于该文件)
static int a,b;
3.内部函数与外部函数
① 内部函数
仅限于本源文件使用
static int add(int a,int b);
② 外部函数(默认)
可被其他源文件调用
extern int add(int a,int b);
int add(int a,int b);
4.预处理
① 宏定义
可用#undef终止,控制作用范围。
- 不带参数的宏定义
仅简单字符串替换,双引号内不替换。
#define PI 3.14
- 带参数的宏定义(形参)
宏调用:实参替换形参,简单替换(形参建议打括号)。
运行结果:z=10
#include <stdio.h> #define A(a,b) (a)+(b) int main(){ int x,y,z; x=5; y=3; z= A(x+y,x-y); printf("z=%d",z); return 0; }
② 宏定义的条件编译(用于避免重复定义)
- 形式一
运行结果:x=0
y=1#include <stdio.h> #define N 0 #ifdef N #define M 1 #else #define M 2 #endif int main(){ int x,y; x=N; y=M; printf("x=%d\n",x); printf("y=%d\n",y); return 0; }
- 形式二
运行结果:x=0
y=2#include <stdio.h> #define N 0 #ifndef N #define M 1 #else #define M 2 #endif int main(){ int x,y; x=N; y=M; printf("x=%d\n",x); printf("y=%d\n",y); return 0; }
- 形式三
运行结果:x=0
y=2#include <stdio.h> #define N 0 #if N #define M 1 #else #define M 2 #endif int main(){ int x,y; x=N; y=M; printf("x=%d\n",x); printf("y=%d\n",y); return 0; }
③ 文件包含
在源文件中将另一个指定文件的全部内容包含进来,即头文件。
//库函数文件
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//自定义文件
#include "text.c" //用于完成某功能或一组宏定义
#include "text.h"