c语言函数调用及应用举例
一,函数的定义
一般来说,执行源程序就是执行主函数main,其他函数只能被主函数所调用,而其他函数之间也可以相互调用。
1.标准库函数:
分为:I/O函数,字符串,字符处理函数,数学函数,接口函数,时间转换和操作函数,动态地址分配函数,目录函数,过程控制函数,字符屏幕和图形功能函数。
这些库函数在不同的头文件中声明。比如:
math.h头文件中有:sin(x),cos(x),exp(x)(求e^x),fabs(x)(求x的绝对值)等库函数。
stdio.h头文件中有:scanf(),printf(),gets(),puts(),getchar(),putchar()等库函数。
string.h头文件中有:strcmp(),strcpy(),strcat(),strlen等库函数。
2.函数的定义:
(1)定义无参函数:
类型名 函数名()
{
函数体
}
or
类型名 函数名(void)
{
函数体
}
(2)定义有参函数
类型名 函数名(形式参数表列)
{
函数体
}
(3)定义空函数
类型名 函数名()
{ }
二,函数的调用
1.函数调用时的参数传递
函数间通过参数来传递数据,即通过主调函数中的实际参数(实参)向被调用函数中的形式参数(形参)进行传递。
实参向形参传递数据的方式:实参将值单向传递给形参,形参的变化不影响实参值。
for example:
#include<stdio.h>
#include<stdlib.h>
int main()
{int a, b;void swap(int a, int b); //函数声明scanf("%d%d", &a, &b); //键盘输入swap(a, b); //函数调用printf("最终的a,b值:\n a=%d b=%d\n", a, b);system("pause");return 0;
}
void swap(int a, int b)
{int t;if (a < b){t = a;a = b;b = t; //a中放大值,b中放小值}printf("自定义函数的a,b值:\n a=%d b=%d\n", a, b);
}
运行结果为:
分析:形参交换了数据,而实参保持原数据不变。这是单向的值传递,所以形参的值改变后而实参的值没有改变。
- 形参在函数中是变量名,在函数调用时,形参被临时分配相应的内存,调用结束后,形参单元被释放,而实参单元保留并维持原值。
- 实参是表达式,负责向对应的形参标识的内存单元传递数据,实参向形参的数据传递是“值传递”。
- 实参与形参必须个数相同
- 对应的形参和实参的类型必须一致
2.函数的返回值
(1)函数的返回值通过函数中的return语句获得。如果需要从调用函数带回一个函数值(供主函数使用),被调函数中需包含return语句。
for example:
int max(int x,int y)
{return(x>y?x:y);
}
(2)在定义函数时要指定函数值的类型
int max(float x,float y) //函数值为整型
char letter(char c1,char c2) //函数值为字符型
double max(int x,int y) //函数值为双精度型
(3)函数类型决定返回值的类型。
3.函数的嵌套
定义函数时不能定义另一个函数,但是可以进行嵌套调用函数。
for example:
*用函数嵌套找出4个数中的最大值。
#include<stdio.h>
#include<stdlib.h>
int max2(int a, int b) //找出a和b中的最大值
{if (a >= b){return a; // a作为返回值}return b; // b作为返回值
}
int max4(int a, int b, int c, int d) //定义找4个数最大值的函数
{int m; //存最大值m = max2(a, b); //调用max2函数,将a,b中大的值放在m中m = max2(m, c); //调用max2函数,将a,b,c中大的值放在m中m = max2(m, d); //调用max2函数,将a,b,c,d中大的值放在m中return m; //返回到主函数
}
int main()
{int a, b, c, d;int max;printf("请输入四个数:\n");scanf("%d%d%d%d", &a, &b, &c, &d);max = max4(a, b, c, d); //调用max4函数printf("最大数位:%d\n", max);system("pause");return 0;
}
三,函数的递归
1.递归概念:
函数的递归调用是指:一个函数在他的函数体内直接或间接地调用它自身。分为:直接递归(函数直接调用自身)和间接递归(函数通过其他函数调用自身)。可分为“回溯”和“递推”两个阶段。
2.递归函数的一般形式:
反值类型 递归函数名(参数说明表)
{
if(递归终止条件)
返回值=递归终止值;
else
返回值=递归调用(...)的表达式;
return 返回值;
}
3.递归函数举例:
*用递归求n的阶乘。
#include<stdio.h>
#include<stdlib.h>
int fac(int n) //定义函数
{int f;if (n < 0)printf("数据错误\n");else if (n == 0 || n == 1)f = 1;elsef = n* fac(n - 1); //n!=n*(n-1)return f; //返回主函数
}
int main()
{int n, y;printf("请输入n的值\n");scanf("%d", &n);y = fac(n); //这里n为实参printf("%d!=%d\n", n, y);system("pause");return 0;
}
汉诺塔问题为经典的递归调用实例。代码如下:
#include<stdio.h>
#include<stdlib.h>
void move(char x, char y) //输出移盘方案
{printf("%c->%c\n", x, y);
}
void hanoi(int n, char one, char two, char three) //移盘
{if (n == 1)move(one, three); //如果是1个盘,直接从第一个座移到第3个座上else{hanoi(n - 1, one, three, two); move(one, three);hanoi(n - 1, two, one, three);}
}
int main()
{int n;printf("输入盘的个数\n");scanf("%d", &n);printf("移盘的步骤:\n");hanoi(n, 'A', 'B', 'C');system("pause");return 0;
分析:将n个盘子从A座上移到C座上需要三步:
(1)将A上的n-1个盘子借助C座先移到B座上;
(2)把A座上剩下的一个盘子移到C座上;
(3)将n-1个盘从B座上借助于A移到C座上。
c语言函数调用及应用举例相关推荐
- C语言函数调用的原理
该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/105088660 C ...
- c语言函数调用参数调用的太少,浅谈C语言函数调用参数压栈的相关问题
参数入栈的顺序 以前在面试中被人问到这样的问题,函数调用的时候,参数入栈的顺序是从左向右,还是从右向左.参数的入栈顺序主要看调用方式,一般来说,__cdecl 和__stdcall 都是参数从右到左入 ...
- C语言C6292错误,测试c语言函数调用性能因素
标签: 函数调用:即调用函数调用被调用函数,调用函数压栈,被调用函数执行,调用函数出栈,调用函数继续执行的一个看似简单的过程,系统底层却做了大量操作. 操作: 1, 调用函 ...
- C语言函数调用栈(一)
以下全文转载自:C语言函数调用栈(一) 程序的执行过程可看作连续的函数调用.当一个函数执行完毕时,程序要回到调用指令的下一条指令(紧接call指令)处继续执行.函数调用过程通常使用堆栈实现,每个用户态 ...
- c语言函数参数压栈,函数调用压栈 浅谈C语言函数调用参数压栈的相关问题
想了解浅谈C语言函数调用参数压栈的相关问题的相关内容吗,在本文为您仔细讲解函数调用压栈的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:函数调用压栈,下面大家一起来学习吧. 参数入栈的顺序 ...
- c语言中staloc是什么意思,C语言函数调用栈(三)
6 调用栈实例分析 本节通过代码实例分析函数调用过程中栈帧的布局.形成和消亡. 6.1 栈帧的布局 示例代码如下: //StackReg.c #include //获取函数运行时寄存器%ebp和%es ...
- 参数在c语言中,C语言函数调用和参数传递
C语言函数被定义以后可以被多次调用,调用的时候可以向它传递参数. C语言函数调用 函数的调用指的就是函数的使用方法. 在程序中使用已经定义的函数,可以使用函数调用表达式,其一般格式如下: 函数名(实参 ...
- 采用汇编语言对c语言函数调用的方法求平均数 汇编实验报告,汇编语言调用c语言完成求平均值.docx...
汇编语言调用c语言完成求平均值.docx <汇编语言程序设计>实验报告系别专业年级学号姓名2012年6月实验七汇编语言对C语言函数调用求平均值一.实验目的本实验主要达到以下目的:1.完成汇 ...
- C语言函数调用时候内存中栈的动态变化详细分析
先了解如下几点知识和过程: * 冯诺伊曼体系计算机程序指令代码都是提前从硬盘加载进入内存从而执行的(如果是哈佛体系结构的计算机指令代码是直接在外存里面执行的,具体可以看我这篇文章,计算机冯诺伊曼体系结 ...
- c语言 函数调用 传值调用 引用调用 传地址调用,C语言中的传值调用和引用调用...
在使用一个音频芯片时,需要用到这样一个功能,即对音量进行调节.在厂家提供的驱动里面没有这样的功能函数,因此需要自行添加.注意到厂家提供的驱动里面包含了一个写入命令的函数,void Vol_Cmd(ui ...
最新文章
- 概率统计:第八章:假设检验
- C语言实现lu分解lu decompose算法(附完整源码)
- Flash务实主义(五)——AS3的垃圾回收(转)
- 根本不值得一提的乒乓球国手王浩
- 字体方向 道路标注_自动驾驶环境感知的“见闻色”——3D点云标注
- mysql的安全管理_MySQL安全管理
- 重装系统解决:CUPS服务未启动,不能管理打印机
- DNSObserver检测DNS安全漏洞
- iGoogle自定义
- Android动画(翻牌抽奖)
- peewee 操作mysql_peewee 数据库操作
- 阔别两年的重逢丨CIMT2019中图仪器精彩重现
- 声音的频率与主观听感
- 【人话版】摸着WEB3过河的互联网风景线
- Thumbnailator
- uni-app封装请求方法和loading样式
- iebook2010+绿色破解版的解压密码
- mtk dts文件的配置
- Mini Crossbow AAT自动跟踪云台设置(配合TeleFlyTiny模块)
- es6——let和const
热门文章
- java -classpath or -cp 的设置和解释
- ExtJS002Window创建
- C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppCommon.targets(611,5): error MSB
- Visual Studio启动、附加进程调试,多个Web Application时启动多个WebServer关闭方法
- Dreamweaver中出现 以下翻译器没有被装载,由于错误:xxxx.htm:有不正确的设置信息 问题的解决方案(8,cs3,cs4似乎都会出现改问题)...
- Linux系统无法载入nvidia-smi驱动
- pytorch 中 torch.optim.Adam
- URL编码(urlencoding)中关于空格的问题
- VI编辑器将//替换为#
- wait放弃对象锁_Java线程:notify()和wait()示例