嵌入式Linux C(八)——函数(详)

一、概述

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)

posted @ 2022-01-19 17:56  周末不下雨  阅读(33)  评论(0编辑  收藏  举报