嵌入式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)


相关文章
|
5月前
|
网络协议 算法 Linux
【嵌入式软件工程师面经】Linux网络编程Socket
【嵌入式软件工程师面经】Linux网络编程Socket
167 1
|
2月前
|
Linux Shell
Linux系统编程:掌握popen函数的使用
记得在使用完 `popen`打开的流后,总是使用 `pclose`来正确关闭它,并回收资源。这种做法符合良好的编程习惯,有助于保持程序的健壮性和稳定性。
102 6
|
2月前
|
Linux Shell
Linux系统编程:掌握popen函数的使用
记得在使用完 `popen`打开的流后,总是使用 `pclose`来正确关闭它,并回收资源。这种做法符合良好的编程习惯,有助于保持程序的健壮性和稳定性。
142 3
|
2月前
|
Linux
在Linux内核中根据函数指针输出函数名称
在Linux内核中根据函数指针输出函数名称
|
3月前
|
Linux PHP
Linux CentOS 宝塔 Suhosin禁用php5.6版本eval函数详细图文教程
【8月更文挑战第27天】本文介绍两种禁用PHP执行的方法:使用`PHP_diseval_extension`禁用和通过`suhosin`禁用。由于`suhosin`不支持PHP8,仅适用于PHP7及以下版本,若服务器安装了PHP5.6,则需对应安装`suhosin-0.9.38`版本。文章提供了详细的安装步骤,并强调了宝塔环境下与普通环境下的PHP路径差异。安装完成后,在`php.ini`中添加`suhosin.so`扩展并设置`executor.disable_eval = on`以禁用执行功能。最后通过测试代码验证是否成功禁用,并重启`php-fpm`服务生效。
49 2
|
3月前
|
NoSQL Linux C语言
嵌入式GDB调试Linux C程序或交叉编译(开发板)
【8月更文挑战第24天】本文档介绍了如何在嵌入式环境下使用GDB调试Linux C程序及进行交叉编译。调试步骤包括:编译程序时加入`-g`选项以生成调试信息;启动GDB并加载程序;设置断点;运行程序至断点;单步执行代码;查看变量值;继续执行或退出GDB。对于交叉编译,需安装对应架构的交叉编译工具链,配置编译环境,使用工具链编译程序,并将程序传输到开发板进行调试。过程中可能遇到工具链不匹配等问题,需针对性解决。
101 3
|
3月前
|
Shell Linux C语言
Linux0.11 execve函数(六)
Linux0.11 execve函数(六)
68 1
|
3月前
|
Linux API
Linux源码阅读笔记07-进程管理4大常用API函数
Linux源码阅读笔记07-进程管理4大常用API函数
|
3月前
|
安全 Unix Linux
Linux Clone函数
Linux Clone函数
63 3
|
3月前
|
Linux
Linux0.11 文件打开open函数(五)
Linux0.11 文件打开open函数(五)
48 0