程序是由一个个函数组成的。我们之前虽然没有正式介绍函数,但是我们早已经开始使用函数了。因为离开了函数,我们的程序没有办法正常的工作。只不过我们使用的是 C 语言内置的标准函数库。
函数就是一段封装好的,可以重复使用的代码,它使得我们的程序更加模块化,不需要编写大量重复的代码。函数可以提前保存起来,并给它起一个独一无二的名字,只要知道它的名字就能使用这段代码。函数还可以接收数据,并根据数据的不同做出不同的操作,最后再把处理结果反馈给我们。 在 C 语言中,我们必须要包含一个函数,就是我们最开始介绍的 mian 函数。
例如: 你用C语言编写了一个MP3播放器程序,那么它的程序结构如下图所示:
可以说C程序的全部工作都是由各式各样的函数完成的,所以也把C语言称为函数式语言
函数是现代编程语言中的重要组成部分。肩负着实现程序功能的职责。是程序的基本组成单元。好的函数往往只实现简单的单一的功能,而不是大而全的万金油。要尽量的瘦身。
在C语言中可从不同的角度对函数分类
从函数定义的角度看,函数可分为库函数和用户定义函数两种
从函数执行结果的角度来看, 函数可分为有返回值函数和无返回值函数两种
从主调函数和被调函数之间数据传送的角度看,又可分为无参函数和有参函数两种
函数头与函数体两部分组成 , 其中函数头部分包含函数的返回值类型,函数名,函数的参数, 函数体部分由实现函数功能的一条至多条语句组成。
定义函数的步骤:
注意: 在c语言中函数是没有重载的,也就是同一个.c文件内部定义的函数名称不能相同
格式:
void 函数名() {
函数体;
}
列:
void printRose() {
printf("Hello, World!\n");
}
注意: 如果函数不需要返回数据给调用者, 那么函数中的return可以不写 ,在合适的时候使用return可以用于直接结束当前函数
格式:
返回值类型 函数名() {
函数体;
return 值;
}
列:
int getMax() {
printf("请输入两个整数, 以逗号隔开, 以回车结束\n");
int number1, number2;
scanf("%i,%i", &number1, &number2);
int max = number1 > number2 ? number1 : number2;
return max;
}
形式参数表列表的格式: 类型 变量名,类型 变量2,......
格式:
void 函数名(参数类型 形式参数1,参数类型 形式参数2,…) {
函数体;
}
列:
void printMax(int value1, int value2) {
int max = value1 > value2 ? value1 : value2;
printf("max = %i\n", max);
}
格式:
返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,…) {
函数体;
return 0;
}
列:
int printMax(int value1, int value2) {
int max = value1 > value2 ? value1 : value2;
return max;
}
在定义函数时,函数名后面小括号()中定义的变量称为形式参数,简称形参, 形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只有在函数内部有效,函数调用结束返回主调函数后则不能再使用该形参变量
int max(int number1, int number2){ // 形式参数
return number1 > number2 ? number1 : number2;
}
在调用函数时, 传入的值称为实际参数,简称实参, 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参, 因此应预先用赋值输入等办法使实参获得确定值
在C语言中,函数的定义顺序是有讲究的, 默认情况下,只有后面定义的函数才可以调用前面定义过的函数, 如果想把函数的定义写在main函数后面,而且main函数能正常调用这些函数,那就必须在main函数的前面进行函数的声明, 否则系统搞不清楚有没有这个函数, 系统搞不清楚这个函数接收几个参数,系统搞不清楚这个函数的返回值类型是什么, 所以函数声明,就是在函数调用之前告诉系统, 该函数叫什么名称, 该函数接收几个参数, 该函数的返回值类型是什么
函数的声明格式: 将自定义函数时{}之前的内容拷贝到调用之间即可,一般在当前文件所有函数前面位置
例如: int max( int a, int b ); int max( int, int );
函数声明仅仅代表着告诉系统一定有这个函数 ,和把这个函数的详细信息告诉系统, 让系统知道这个函数具体的业务逻辑是怎么运作的
函数声明注意事项:
main是函数的名称, 和我们自定义的函数名称一样, 也是一个标识符只不过main这个名称比较特殊, 程序已启动就会自动调用它
return 0; 如果main函数的执行正常, 那么就返回0, 如果main函数执行不正常, 那么就返回一个非0的数
以上我们根据之前学的,都能明白, 在main函数中还有一个内容非常重要,就是main函数的参数,main函数有三个参数argc、argv和envp
int argc
用于存放命令行参数的个数。 (第一个代表他自己)char *argv[]
是个字符串的数组,每个元素都是一个字符指针,指向一个字符串,即命令行中的每一个参数。char *envp[]
也是一个字符串的数组,这个数组的每一个元素是指向一个环境变量的字符指针。(在实际开发中,envp参数的应用很少,各位了解一下就行了。)#include <stdlib.h>
#include <stdio.h>
int main(int argc, char *argv[], char **env) {
int i = 0;
printf("******************* Begin argv *******************\n");
printf("argc: %d\n", argc); //程序名称; =1 只有一个
for (i = 0; i < argc; i++) {
printf("%s\n", argv[i]); //指向输入的程序路径及名称
}
printf("******************* End argv *******************\n");
printf("\n");
printf("\n");
printf("******************* Begin env *******************\n");
for (i = 0; env[i] != NULL; i++) {
printf("%s\n", env[i]); //为环境变量
}
printf("******************* End env*******************\n");
printf("\n");
system("pause");
return 0;
}
参数1是启动程序, 之后就是实际的参数,使用空格隔开
一般会这样使用,第三个参数基本不会用到的
int main(int argc, char *argv[]) {
return 0;
}
什么是递归函数? 函数递归就是函数自己调用自己。(自己搞自己)
那么递归的好处是什么呢? 它能够将复杂的问题,用少量的代码来表示,增加了代码的可读性。
递归的两个必要条件:
列: 按照顺序打印一个数的整形值
#include <stdio.h>
int print(int n) {
if (n > 9) {//递归结束条件
print(n / 10);
}
printf("%d", n % 10);
}
int main() {
int num ;
printf("请输入一个整数:");
scanf("%d", &num);
print(num);
return 0;
}
解析: 看懂下图你递归就入门了
点赞 -收藏-关注-便于以后复习和收到最新内容有其他问题在评论区讨论-或者私信我-收到会在第一时间回复感谢,配合,希望我的努力对你有帮助^_^
免责声明:本文部分素材来源于网络,版权归原创者所有,如存在文章/图片/音视频等使用不当的情况,请随时私信联系我。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://huanmin.blog.csdn.net/article/details/125678754
内容来源于网络,如有侵权,请联系作者删除!