一、函数与一维字符型数组定义返回值 函数名int 数组名[], int len{// sizeof(数组名) ----》sizeof(int *) ----8字节//外面数组怎么使用函数内数组就怎么使用}调用函数名(数组名 数组长度);void print_array(int a[], int len){}print_array(a, len);数组的数组名是数组的首元素地址。传参注意一维字符型数组作为函数参数传递时只需要传递数组即可不需要传递长度因为字符型数组保存的字符串末尾有\0结束标志。数组作为函数参数传递时本质传递的是数组的首元素地址在被调函数中sizeof(数组名形参)---本质求地址在计算机内存中的大小。练习封装 mystrlen 函数返回数组中有效字符的个数封装 mystrcpy 函数将源字符型数组中的元素拷贝到目标字符型数组。void mystrcpy(char dst[], char src[]);封装 mystrcat 函数将源字符型数组中的元素拼接到目标字符型数组元素后边void mystrcat(char dst[], char src[]);封装 mystrcmp 函数实现两个字符串的比较返回0 , 0, 0二、函数和二维整型数组传参注意二维整型数组传参时形参必须说明是二维数组行数可以省略列数不能省略。char 数组名[100];定义返回值 函数名(char 数组名[]){函数体}调用函数名(数组名);void print_str(char str[]){}print_str(str);定义返回值 函数名int 数组名[][列数]int 行数{}调用函数名(数组名行数)int a[3][4] {0};void print_2D_array(int a[][4], int hang){}printf_2D_array(a, sizeof(a)/sizeof(a[0]));形参int a[][列数]在自定义的函数中行数无法计算所以可以通过参数的方式传递在自定义的函数中列数可以计算sizeof(a[0]) / sizeof(a[0][0]);三、函数和二维字符型数组传参定义返回值 函数名(char 数组名[][列数], int 行数){}调用函数名(数组名 行数);char str[3][100] {0};void print_2DC_array(char str[][100], int hang){}print_2DC_array(str, 3);四、变量的作用域和生命周期1. 标识符作用域空间角度作用域标识符/变量可以被使用的范围局部作用域在{}内部被定义的变量的作用范围局部变量定义在局部作用域中的变量函数内部定义的变量、函数形参全局作用域可使用范围在全局{}外面。比如定义函数全局变量定义在全局作用域的变量。注意标识符必须先定义再使用。在相同作用域中不能定义同名标识符变量、函数。在具有包含关系的作用域中出现了同名标识符外层标识符在内层不可见就近原则2. 变量的生命周期时间角度变量的生命周期从变量的空间开辟到空间回收对应的生存期。动态生命周期局部变量在被定义的时候开辟空间超出其作用域范围空间被回收。静态生命周期和程序运行的生命周期一样长全局变量从程序运行之前空间开辟程序运行结束空间被回收。static 修饰的静态变量从程序运行之前空间开辟程序运行结束空间被回收。1. 作用域没发生变化局部作用域。2. 生命周期变为静态生命周期。总结局部变量作用域在局部超出局部作用域无法访问动态生命周期定义时开辟空间超出作用范围空间被回收局部变量保存在栈区未被初始化为随机值。全局变量/static 静态变量全局变量作用域在全局static 静态变量作用域在局部静态生命周期程序运行之前空间开辟程序运行结束空间被回收全局变量/static 静态变量保存在数据区。全局变量/static 静态变量未被初始化时默认为 0。未初始化的全局变量/static 静态变量存储在 .bss 段.bss 段系统默认清 0。已初始化的全局变量/static 静态变量存储在 .data 段。五、变量的存储类型变量的存储类型auto默认存储类型staticstatic 修饰局部变量静态变量具备静态生命周期延长局部变量的生命周期。static 修饰函数该函数只允许在当前原文件中被调用。static 修饰全局变量该变量只允许在当前文件中使用。register寄存器变量。int a存储类型 数据类型 变量名register 修饰变量时建议编译器将该变量存储在寄存器中。register int i 0;register 仅仅是一个建议。int *p;extern修饰全局变量/函数声明。extern 修饰全局变量用来声明全局变量表示允许被外部的 .c 使用。extern 声明函数表示该函数允许被外部的 .c 使用。