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

简介: 嵌入式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));
}

0a2653c851af460fa595bd959398a8f1.png


int *( *( arr[5])())()


0a2653c851af460fa595bd959398a8f1.png

右边是数组,左边是,则是数组元素是指针

右边是函数,左边是 *,则是函数返回值是指针


六、可变参数


输入的参数可变,根据自己需求决定,如printf的变量多少

可变参数的实现原理


形参在栈空间上是连续存储的:

第一个形参用来说明后面的参数类型或者个数

#include <stdarg.h>


网址:C语言中可变参数的用法


作业


作业1:编程实现将一个字符串(26个小写字母)中出现次数最少的字符删除

作业2:利用可变参数,实现printf(puts、putc)


相关文章
|
22天前
|
JSON 机器人 Linux
推荐一款嵌入式Linux开源框架与封装-cpp-tbox
推荐一款嵌入式Linux开源框架与封装-cpp-tbox
52 3
|
23天前
|
Linux
关于Linux目录访问函数总结
关于Linux目录访问函数总结
13 1
|
30天前
|
算法 Linux C++
【Linux系统编程】深入解析Linux中read函数的错误场景
【Linux系统编程】深入解析Linux中read函数的错误场景
205 0
|
1月前
|
存储 监控 Linux
【Linux IO多路复用 】 Linux下select函数全解析:驾驭I-O复用的高效之道
【Linux IO多路复用 】 Linux下select函数全解析:驾驭I-O复用的高效之道
53 0
|
30天前
|
存储 算法 Linux
【Linux系统编程】深入理解Linux目录扫描函数:scandir目录函数(按条件扫描目录
【Linux系统编程】深入理解Linux目录扫描函数:scandir目录函数(按条件扫描目录
39 0
|
2天前
|
算法 Linux Shell
【linux进程(二)】如何创建子进程?--fork函数深度剖析
【linux进程(二)】如何创建子进程?--fork函数深度剖析
|
10天前
|
Linux 编译器 测试技术
嵌入式 Linux 下的 LVGL 移植
嵌入式 Linux 下的 LVGL 移植
|
17天前
|
Linux 开发者
Linux文件编程(open read write close函数)
通过这些函数,开发者可以在Linux环境下进行文件的读取、写入和管理。 买CN2云服务器,免备案服务器,高防服务器,就选蓝易云。百度搜索:蓝易云
85 4
|
23天前
|
Linux
嵌入式Linux系统(NUC980)tf卡出错处理errors=remount-ro改为errors=continue
嵌入式Linux系统(NUC980)tf卡出错处理errors=remount-ro改为errors=continue
7 1
|
23天前
|
安全 Linux
嵌入式Linux系统关闭串口调试信息的输出
嵌入式Linux系统关闭串口调试信息的输出
16 1