【从零开始的嵌入式生活】必备基础知识7——函数

【从零开始的嵌入式生活】必备基础知识7——函数,第1张

【从零开始的嵌入式生活】必备基础知识7——函数

前言

今天是2020年的除夕,想想一直要更新的文章还没更就赶紧来写了,希望十二点前能写完呀0.0
今天是今年的最后一天,也是基础知识的最后一篇,讲完函数就可以进入稍微高级一点的应用啦。撒花
三连即可提高学习效率0.0

六作者简介:一个学嵌入式的年轻人
✨联系方式:2201891280(QQ)
源码地址:https://gitee.com/xingleigao/study_qianrushi
⏳全文大约阅读时间: 60min


文章目录

前言一、函数的基本用法

1.函数的声明、实现2.函数的调用(函数的使用) 二、函数的参数传递

1.全局变量2.复制传递方式3.地址传递方式4.二维数组的求和 三、指针函数四、递归函数五、函数指针写在最后


一、函数的基本用法

函数是一个完成特定功能的代码模块,其程序代码独立,通常要求有返回值,也可以是空值(无返回函数)。
下面是我们常用的函数:


1.函数的声明、实现

一般形式:

<数据类型>  <函数名称>( <形式参数说明> ) {
           语句序列;
           return[(<表达式>)];
} 

注意点:

<数据类型>是整个函数的返回值类型。return[(<表达式>)]语句中表达式的值,要和函数的<数据类型>保持一致。如无返回值应该写为void型<形式参数说明>是逗号”,”分隔的多个变量的说明形式(可以无参数)大括弧对 {<语句序列> },称为函数体;

函数的说明就是指函数原型:在函数的定义在mian后面需要在main前面进行声明

double Power(double a,int x);
double  Power(double, int);

2.函数的调用(函数的使用)

函数的调用必须在声明之后!!!!!如果不想大段的声明在前面可以放后面,前面先进行声明。

函数名称(〈实际参数〉)

实参就是在使用函数时,调用函数传递给被调用函数的数据。需要确切的数据函数调用可以作为一个运算量出现在表达式中,也可以单独形成一个语句。对于无返回值的函数来讲,只能形成一个函数调用语句。

头文件就是包含了函数原型的声明和定义,所以需要先引入头文件。

二、函数的参数传递

函数的传递方式:(非常重要且容易出错)

全局变量复制传递方式地址传递方式


1.全局变量

全局变量就是在函数体外说明的变量,它们在程序中的每个函数里都是可见的

全局变量一经定义后就会在程序的任何地方可见。函数调用的位置不同,程序的执行结果可能会受到影响。(并且容易变成临界区资源,所以不建议使用)


2.复制传递方式

调用函数将实参传递给被调用函数,被调用函数将创建同类型的形参并用实参初始化

形参是新开辟的存储空间,因此,在函数中改变形参的值,不会影响到实参


3.地址传递方式

按地址传递,实参为变量的地址,而形参为同类型的指针

被调用函数中对形参的 *** 作,将直接改变实参的值(被调用函数对指针的目标 *** 作,相当于对实参本身的 *** 作)


4.二维数组的求和

数组名的本质就是指针,在传参的时候需要传数组长度。
举个例子希望大家可以理解:

int  fun(int n, int m, int (*a)[m]);
int main()
{
	int a[][3] = {{1, 9, 7}, {3, 4, 6}};
	int sum = 0;
	sum = fun(2, 3, a);
	printf("sum=%dn", sum);
	return 0;
}

int  fun(int n, int m, int (*a)[m]) {
	int i, j, ret = 0;
	for (i = 0; i < n; i++) {
		for (j = 0; j < m; j++) {
			ret += a[i][j];
		}
	}
	return ret;
}
三、指针函数

指针函数是指一个函数的返回值为地址量的函数

指针函数的定义的一般形式如下:

<数据类型>  *  <函数名称>(<参数说明>) {
     语句序列;}

返回值:全局变量的地址/static变量的地址/字符串常量的地址/堆的地址(malloc)(静态区域)


举个例子:

#include 
char *  mystring( )  {
	 char str[20];
	 strcpy(str, “Hello”);
	 return str;
}
int  main(void)
{
	printf(“%sn”, mystring());
	return 0;
}

上面的问题:

    string.h没有包含函数返回了一个堆上内存,所以越界访问了。
四、递归函数

递归函数是指一个函数的函数体中直接或间接调用了该函数自身

递归函数调用的执行过程分为两个阶段:

    递推阶段:从原问题出发,按递归公式递推从未知到已知,最终达到递归终止条件回归阶段:按递归终止条件求出结果,逆向逐步代入递归公式,回归到原问题求解

举个例子:写一个递归函数,计算n!

int fac(int n);
int main(int argc,char argv[])
{
       int n;
       printf("input:");
       scanf("%d",&n);
       printf("%d",fac(n));
       return 0;
}

int fac(int n)
{
       if(n == 0||n ==1)
               return 1;
       return n * fac(n-1);
}

五、函数指针

函数指针用来存放函数的地址,这个地址是一个函数的入口地址

<数据类型> (*<函数指针名称>)(<参数说明列表>);

<数据类型>是函数指针所指向的函数的返回值类型<参数说明列表>应该与函数指针所指向的函数的形参说明保持一致(*<函数指针名称>)中,*说明为指针()不可缺省,表明为函数的指针
举个例子

int (*swap)(int *,int*);

函数指针数组是一个保存若干个函数名的数组
一般形式如下

<数据类型>  (*<函数指针数组名称> [<大小>] )(<参数说明列表> );

其中,<大小>是指函数指针数组元数的个数
其它同普通的函数指针
举个例子

int (*swap[6])(int *,int*);
写在最后

今天主要讲解了C语言的基础知识,明天是新的一年也是一个新的开始,祝大家发财呀0.0指针有一部分的内容在函数部分会进行讲解,大家可以对照着一起看。


另外我在更新的就是算法笔记的一些例题笔记,这个系列是用于提高我的算法能力,如果有兴趣对算法领域感兴趣找不到合适的入门文章也可以追更,如果我更新的太慢了请大家点赞收藏,一键三连才能更有更新的动力呀0.0

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5718438.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-18
下一篇 2022-12-18

发表评论

登录后才能评论

评论列表(0条)

保存