C语言(函数与数组)

发布时间:2026/8/4 5:46:21
C语言(函数与数组) 8.函数和一维字符型数组传参char数组名[100];定义返回值 函数名(char数组名[]){函数体}调用函数名(数组名);void print_str(char str[]){}print_str(str);注意1.一维字符型数组作为函数参数传递时只需要传递数组即可不需要传递长度因为字符型型数组保存的字符串末尾有\0结束标志。2.数组作为函数参数传递时本质传递的是数组的首元素地址在被调函数中sizeof(数组名形参)----》本质求地址在计算机内存中的大小。练习1.封装mystrlen的函数返回数组中有效字符的个数2.封装mystrcpy函数将源字符型数组中的元素拷贝到目标字符型数组。void mystrcpy(char dst[], char src[]);3.封装mystrcat函数将源字符型数组中的元素拼接到目标字符型数组元素后边void mystrcat(char dst[], char src[]);4.封装mystrcmp函数实现两个字符串的比较返回0 , 0, 09.函数和二维整形数组传参定义返回值 函数名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]));注意1.二维整形数组传参时形参必须说明是二维数组行数可以省略列数不能省略。形参int a[][列数]2.在自定义的函数中行数无法计算所以可以通过参数的方式传递3.在自定义的函数中列数可以计算sizeof(a[0]) / sizeof(a[0][0]);10.函数和二维字符型数组传参定义返回值 函数名(char数组名[][列数], int行数){}调用函数名(数组名 行数);char str[3][100] {0};void print_2DC_array(char str[][100], int hang){}print_2DC_array(str, 3);11.变量的作用域和生命周期1.标识符作用域空间角度作用域标识符/变量可以被使用的范围局部作用域在{}内部被定义的变量的作用范围局部变量定义在局部作用域中的变量函数内部定义的变量、函数形参全局作用域可使用范围在全局{}外面。比如定义函数全局变量定义在全局作用域的变量。注意1.标识符必须先定义再使用。2.在相同作用域中不能定义同名标识符变量、函数。3.在具有包含关系的作用域中出现了同名标识符外层标识符在内层不可见就近原则2.变量的生命周期时间角度变量的生命周期从变量的空间开辟到空间回收对应的生存期。动态生命周期局部变量在被定义的时候开辟空间超出其作用域范围空间被回收。静态生命周期和程序运行的生命周期一样长全局变量从程序运行之前空间开辟程序运行结束空间被回收。static修饰的静态变量从程序运行之前空间开辟程序运行结束空间被回收。1.作用域没发生变化局部作用域。2.生命周期变为静态生命周期。总结局部变量1.作用域在局部超出局部作用域无法访问2.动态生命周期定义时开辟空间超出作用范围空间被回收3.局部变量保存在栈区未被初始化为随机值。全局变量/static静态变量1.全局变量作用域在全局static静态变量作用域在局部2.静态生命周期程序运行之前空间开辟程序运行结束空间被回收3.全局变量/static静态变量保存在数据区。4.全局变量/static静态变量未被初始化时默认为0。5.未初始化的全局变量/static静态变量存储在.bss段.bss段系统默认清0.6.已初始化的全局变量/static静态变量存储在.data段。3.变量的存储类型int a存储类型 数据类型 变量名变量的存储类型auto默认存储类型static1. static修饰局部变量静态变量具备静态生命周期延长局部变量的生命周期。2. static修饰函数该函数只允许在当前原文件中被调用。3. static修饰全局变量该变量只允许在当前文件中使用。register寄存器变量。register修饰变量时建议编译器将该变量存储在寄存器中。register int i 0;register仅仅是一个建议。int *p;p i; //x i是寄存器变量无法取址extern修饰全局变量/函数声明。1. extern修饰全局变量用来声明全局变量表示允许被外部的.c使用。2. extern声明函数表示该函数允许被外部的.c使用。12.预处理命令1. gcc的编译的四个步骤2.预处理命令宏定义不带参宏---》符号常量#define标识符 值#define PI 3.1415带参宏宏函数#define标识符(参数1 参数2参数3)宏的实现#define PI (3.14)#define ADD(a, b) ((a)(b))#define MAX(a, b) ((a) (b) ? (a) : (b))#define AREA(r) ((PI) * (r) * (r))注意1.宏作为预处理命令负责在预处理阶段展开不做运算只是代码的替换2.宏标识符最好大写定义宏时不能加分号3.宏只是代码的替换能加就加括号。4.宏和函数的区别宏是预处理阶段的代码替换、会使得代码体积增大函数是在运行时的调用需要保护现场和恢复现场头文件包含#include stdio.h#include head.h头文件放1.可以有包含的其他头文件2.声明的数据类型3.宏定义4.函数和全局变量的声明注意1. 表示包含的是系统中的头文件让编译器从系统路径下找/usr/include2. 表示包含的头文件是用户自己定义的头文件让编译器从当前路径下寻找。条件编译1.头文件中防止头文件重复包含#ifndef宏#define宏//头文件内容#endif根据“宏”有没有被定义出来决定该头文件中的内容要不要加入到编译中。2.条件编译#if逻辑结果表达式//代码#endif根据“逻辑结果表达式”的结果决定中间的代码要不要加入到编译中//代码屏蔽#if 0//代码#endif3.条件编译#ifdef宏//代码1#else//代码2#endif根据“宏”有没有被定义决定是否编译代码1或者代码2#ifndef宏//代码1#else//代码2#endif