一、标识符的作用域和可见性
1.局部作用域(在栈区):{ 定义变量 }是由函数、代码块(如循环或条件语句)等边界所定义的。在局部作用域内声明的变量(局部变量)只能在该作用域内访问。
(1)形参为局部变量。
(2)局部变量的生命周期从它们被创建时(当代码块被调用时)开始,到代码块结束时自动销毁。每次调用该函数时,局部变量都会被重新创建。
2.全局作用域(在静态区,可用于函数传参。):指在一个程序中,变量或函数在整个文件或多个文件中可被访问的范围。相对于局部作用域,全局作用域的变量的生命周期覆盖整个程序的运行时间。
(1)全局变量未被初始化,会自动位模式清零(值为0)。
(2)所有函数都具有全局性。
3.标识符使用规则
(1)标识符必须先定义再使用。
(2)在没有包含关系的不同作用域中定义的同名标识符互不影响。
(3)在两个或两个具有包含关系的不同作用域中定义同名标识符,外层标识符在内层不可见。
(4)在同一作用域当中不能定义同名标识符。
4.变量的生存期
(1)静态生存期:是指在程序执行过程中分配内存的区域,其中的变量在程序的整个生命周期内存在,变量的生存期与程序运行周期相同。通常用于存储全局变量和静态变量。(用static修饰的局部变量,将动态生存区改为静态生存区。)
(2)动态生存期:是计算机程序在运行时申请内存的区域。与栈存储区(Stack)不同,动态生存区允许程序在运行时根据需要动态分配和释放内存。动态分配的内存的生命周期由程序员控制。内存可以在运行时分配,并且在不再使用时通过调用free()
进行释放。这与栈上的局部变量不同,后者在离开作用域时自动释放。
5、关键字
(1)auto:用于声明自动变量(automatic variables)。这是最常见的变量类型,通常是在函数内部定义的变量
(2)static:(a)在全局变量或函数前加static则该全局变量或函数只能在本.c中使用。
(b)在函数内部使用 static
关键字声明的变量称为静态局部变量。
(3)register:用于请求编译器将变量存储在 CPU 的寄存器中, 在cpu中没有地址。
(4)extern:用于声明一个变量或函数是在其他源文件中定义的。它主要用于实现跨文件的数据共享和函数调用,使得不同模块或源文件之间能够访问彼此的变量或函数。
6.头文件中只放函数声明。
二、预处理命令(在编译前)
(1)编辑 预处理 编译 链接 运行
(2)宏定义(宏名大写)
(a)无参宏:(#define 标识符 字符串)后不加;本质上是文本替换在预处理阶段将宏名替换为具体内容。
(b)带参宏:(#define 参数表 字符串)通过宏替换机制在预处理阶段进行文本替换,使得代码更加灵活和简洁。
(3)文件包含:(#include<文件名> #include"文件名")文件包含(Include)是一种通过引入外部文件的方式来组织代码和复用功能的机制。当编译器遇到 #include
指令时,它会将指定的文件的内容直接插入到当前源文件的相应位置。
(4)条件编译:允许程序根据预定义的宏或自定义条件选择性地编译代码的一部分。
条件编译主要使用以下预处理指令:
#define
:定义一个宏。#ifdef
:如果定义了宏,则编译后面的代码。#ifndef
:如果未定义宏,则编译后面的代码。#if
、#elif
、#else
、#endif
:根据表达式的值决定编译。#undef
:取消宏定义。