一.二维数组作为函数参数
void printArray2D(int a[][4],int rows) // 用函数调用实现二维数组打印
{
int cols = sizeof(a[0]) / sizeof(a[0][0]);
int i,j;
for(i = 0;i < rows;++i)
{
for(j = 0;j < cols;++j)
{
printf("%d",a[i][j]);
}
}
}
int main(void)
{
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int rows = sizeof(a) / sizeof(a[0]);
printArray2D(a,rows);
}
ps:1.没声明时,被调函数需要写在主调函数之前。
2.因为二维数组传参,传的是地址值,因此,被调函数无法知道实参的实际大小,所以还需传入被调函数的大小,a的大小为3,表示有3个一维数组。
3.在定义函数时,传入二维数组作为实参的每个一维数组元素定义个数,应与形参表示数字相同。
如上面个实参为 a[3][4],形参为a[][4]。
注:二维字符型数组传参与二维整型数组传参类似。
二.标识符的作用域与可见性
作用域分为 局部作用域 和 全局作用域。
局部作用域通常指花括号里。
int g_i; //全局变量 通常存在内存的全局区,从定义开始,到本文件结束,才会回收空间
int main(void)
{
int i = 0; //局部变量 通常存在内存的栈区
int j = 0; //局部变量 通常存在内存的栈区
return 0;
}
ps: 全局变量不赋值,默认为0。而局部变量不赋值,则是个随机数。
标识符的可见性
1.标识符必须先定义再使用。
2.在同一作用域中不得定义同名标识符,即使是 int i,和double i。
3.在没有包含关系的不同作用域中定义的同名标识符互不影响。
4.在两个或多个具有包含关系的作用域中定义的同名标识符,外层标识符在内层不可见。
int i = 15;
int main(void)
{
int i = 10;
{
int i = 100;
printf("%d\n",i);//打印值为100
}
printf("%d\n",i);//打印值为10
return 0;
}
ps: 遵循就近原则
三.变量的生存期
变量的生存期分为 静态生存期和动态生存期
int g_i // return 后结束
int main(void)
{
auto int k; //加上auto关键字,表示 k 变量空间的开辟与销毁是自动的
static int j; // 静态局部变量,在全局区,不定义,默认为0
int i; // return 前结束
register int p; // 表示变量 p 被开辟在寄存器中
printf("Hello World!\n");
return 0;
}
总结;在栈上的具有动态生存期,在全局区上的,具有静态生存期。
四.extern声明外部变量
知识碎片: 1. :vsp func.c 在同一个窗口下新建一个func.c文件
2. :set mouse = a 允许两个窗口切换鼠标
// func .c 文件
int add(int a,int b)
{
int sum = a + b;
return sum;
}
static int g_a; // 这里的static表示 此时g_a只能在func.c中用
static int sub(int a, int b) //这个函数只能在func.c中被调用
{
return 0;
}
//fun.h文件,且编译时,头文件不参与编译
extern int add(int a,int b); //函数的声明
//main.c文件
#include "func.h" //包含了该头文件
int main(void)
{
int a = 10;
int b = 20;
printf("%d\n",add(10,20)); //直接调用函数
return 0;
}
gcc -oapp main.c func.c
进行编译