一、概述
1.函数基础语法(函数定义、调用、声明)
2.函数的使用注意事项(传值、返回值)
3.企业级函数(复用性、维护性、扩展性)—>华为编码
二、函数基础语法
2.1 函数三要素
函数名、函数形参、函数返回值
函数名:命名体现自注释性,提高代码可读性(动词_名词)(4)不要出现拼音,多看开源代码
函数形参:传什么类型要用什么类型的变量来接(a == 元素指针;aa == int (*a)[] aaa = int (*aa)[][])
函数返回值:return(关键字)(结束当前函数);exit(函数)(结束整个程序)
2.2 函数使用形式
函数声明(在调用函数前需声明函数)、函数定义、函数调用
外部定义函数 extern
函数定义:函数名、函数的返回值、形参的类型及变量名
函数调用:函数名,实参的变量名或者实参的地址
函数声明:函数名,函数返回值,形参的类型(变量名可以不提供) :不分配内存
2.3 使用的注意事项
1.函数的传参
传值 VS 传地址
练习:编写一个函数:实现交换数字
2.3.1 函数的调用过程
1.通过函数名找到函数的入口地址:函数地址 == 函数入口起止 ==&函数名(函数指针)
2.给形参分配空间:
3.传参:将实参的值传递给形参的空间存储
4.执行函数体语句
5.函数返回,并释放空间(函数空间:局部变量)
传值(传实参变量名)VS 传地址(传实参变量的地址)
1.当只使用不修改实参变量内存空间的值,在函数调用时,传实参变量名(只能使用,不能修改)
2.当既使用也修改实参变量内存空间的值,在函数调用时,传实参变量的地址;
传指针时,不要误认为就是在传地址
判断:修改指针变量对应内存空间值(传指针变量的地址),还是要修改指针变量指向内存空间的值(传指针变量名)
void get_mem(char *ptr) { ptr = (char *)malloc(sizeof(char) * 100); } void get_mem(char **ptr) { *ptr = (char *)malloc(sizeof(char) * 100); } char *ptr; //get_men(ptr);//传实参变量名(只能使用不能修改) get_men(&ptr); strcpy(ptr,"hello world"); printf("ptr = %s\n",ptr);
2.3.2 传出参数,传入参数(大多数函数实参)
传入参数:传递给函数只使用不修改的实参
传出参数:传递给函数修改的实参(相当于函数返回值)
函数如何返回多个值?结构体,传出参数
int func(char *ptr) { *ptr = 'a'; return 5; } int main { char op; int result = func2(&op); rerurn 0 }
2.3.3 命令行参数
给主函数传参
argc:保存的是,有多少参数
argc:参数保存在的数组里
2.3.4 函数返回值
不能返回局部变量的地址
解决:static
2.3.5 主函数的return 0
告诉gcc,是正常退出的,无异常
三、企业级函数的编写
1. 函数的编码规范
看文档
四、函数指针
函数指针变量:变量,保存地址,地址是函数的地址(函数的入口地址)
函数名:指针,保存函数地址(函数入口地址)
什么时候使用函数指针?可以作为形参
函数指针工程应用作用:
1.隐藏调用接口和调用形式(提供统一的调用方式)
2.间接体现多态,提高代码的扩展性(C++)
int (*p_func)(int,int) p_func = add; printf("%d\n",p_func(5,6));
int add(int a,int b) { return a + b; } int test(int (*p_func)(int,int),int a,int b)//p_func:指向的函数称之为回调函数 { return p_func(a,b); } test(add,5,6)
五、函数指针数组
数组,数组里每个元素都是函数指针(是指针函数的一种)
int (* p_func_array[4])(int,int) p_func_array[0] = add; p_func_array[1] = sub; p_func_array[2] = mul; p_func_array[3] = div; for(int i = 0;i < 4; i++) { printf("%d\n",p_func_array[i](6,3)); }
int *( *( arr[5])())()
右边是数组,左边是,则是数组元素是指针
右边是函数,左边是 *,则是函数返回值是指针
六、可变参数
输入的参数可变,根据自己需求决定,如printf的变量多少
可变参数的实现原理
形参在栈空间上是连续存储的:
第一个形参用来说明后面的参数类型或者个数
#include <stdarg.h>
网址:C语言中可变参数的用法
作业
作业1:编程实现将一个字符串(26个小写字母)中出现次数最少的字符删除
作业2:利用可变参数,实现printf(puts、putc)