今天是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)(静态区域)
举个例子:
#includechar * 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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)