一、二维数组作为函数参数
当二维数组作为函数参数时,需要两个参数(int a[][4],int rows);
其中,在定义数组时,其列数必须赋值,不能省略。例如:
void printfArray(int a[][4],int rows)
二、标识符的作用域与可见性
1.作用域
(1).局部作用域:变量定义在函数或代码模块(如:if,for等)内,仅在该范围有效,出范围则“失效”。其中,函数形参也属于局部作用域。
(2).全局作用域:变量定义在所有函数外(代码最外层),作用域从定义处到本文件结束,可跨函数访问。
<注意>:全局变量可用来传参,存在于静态区,若未对其进行初始化,则均为0。例如;
#include
int a; //a为全局变量
int b; //b为全局变量
int add(void)
{
return a + b;
}
int main(void)
{
int a,b;
printf("%d\n",add(a,b));
return 0;
}
其输出结果为0。
2.可见性规则
(1)标识符必须先定义后使用。
(2) 在没有包含关系的两个不同作用域中定义的同名标识符互不影响。
(3) 在同一作用域中,不得定义同名标识符。
(4) 在两个域或多个具有包含关系的作用域中定义的同名标识符,外层标识符在内层不可见。——"就近原则"
三、变量存储类型域生存期
1.生存期分类
(1) 静态生存期:变量随程序启动分配内存,程序结束才释放,与整个程序的运行周期相等。
(如:全局变量、static修饰的变量)
(2)动态生存期:变量在代码块或函数执行时临时分配内存,执行结束即释放(如:普通局部变量auto,可省略auto关键字)。
2.关键存储类型
(1)auto变量:默认局部变量,动态分配内存,作用域/生存期限于代码块。
(2)static变量:
<1>修饰局部变量:转变为静态生存期(程序运行期始终存在),但作用域仍限于局部;多次调用代码块时,值会保留上一次结果。
<2>修饰全局变量/函数:限制作用域为当前文件,其他文件无法访问(避免跨文件冲突)。
(3) register变量:建议编译器将变量存储在寄存器,加速访问;注意:寄存器变量无法用&取地址。
四、多文件编程(工程化基础)
(1) 核心文件分工
<1> .c 文件:写函数/变量的定义(如 int add() { })
<> .h文件:写函数/变量的声明
extern int add()
(2)编译和链接流程
1>编译命令
<1>创建main.c主函数,vi main.c
<2>创建一个垂直分屏的fun.c函数,用来存放被调用的函数;在fun.c文件上方分屏一个fun.h文件,用来存放声明。
在main.c命令行输入 :vsp fun.c //此指令创建了一个垂直分屏的fun.c的文件
在其fun.c的命令行输入 :set mouse=a //此指令可以使得光标可以在两个文件中自由移动和编辑。
在fun.c的命令行输入 sp fun.h //此指令可在fun.c文件上方分屏一个fun.h文件,用来存放声明
<3>编译(在主程序中,使用需先声明)
保存各文件后,输入 gcc -oapp main.c fun.c //合并编译生成可执行文件。
2>跨文件调用
若要在 main.c 用 fun.c的变量/函数,需在main.c中包头文件
#include"fun.h" //包含头文件,获取声明。
补充:
在fun.h中用extern声明变量/函数(如 extern int);
限制作用域:若全局变量/函数仅想在当前.c文件使用,加static修饰(如 static int --;)