C语言

您所在的位置:网站首页 c语言count函数加法 C语言

C语言

2022-11-06 04:28| 来源: 网络整理| 查看: 265

最近学习C语言有了一些自己的理解,希望跟各位小伙伴们分享C语言中函数这个模块,大家一起来学习吧

目录 一.  什么是函数? 什么是函数? 二.  有哪些函数?(即函数的分类) 有哪些函数?(即函数的分类)

        2.1 库函数

                2.1.1 对库函数的介绍

                2.1.2 如何使用库函数

        2.2 自定义函数

三.  函数的传参  函数的传参

        3.1 实参

        3.2 形参

四.  函数的调用  函数的调用

        4.1 传值调用

        4.2 传址调用

五.  函数的嵌套调用和链式访问  函数的嵌套调用和链式访问

        5.1 函数的嵌套调用

        5.2 函数的链式访问

六.  函数的声明与定义  函数的声明与定义

        6.1 函数声明

        6.2 函数定义

七.  递归与迭代   递归与迭代

        7.1 递归

        7.2 迭代 

一.  什么是函数?

对于初学c语言的小白来说,函数不是数学中的概念吗?例如:三角函数,指数函数,对数函数等等,但是我们学的毕竟是c语言可不是难懂的数学。在c语言中,我们需要通过编译代码来解决大大小小的问题,每一个问题就是一个大型的程序,而其中的某部分代码就是为了完成某些功能而设计,每一个单独存在的代码被称作"子程序",而这些子程序又被称为''代码",也就是我们今天要学习的知识。

二.  有哪些函数?(即函数的分类) 2.1  库函数 2.1.1  对库函数的介绍

何为库函数?库函数?好像是一个从未听过的概念,但是我要说其实库函数其实每天都在我们身边。加法?是库函数!乘法?是库函数!字母长度?也是库函数!那库函数到底是什么?

下面来看度娘的介绍

 2.1.2  如何使用库函数

库函数种类繁多,例如:

1.printf("%d",a);//stdio 将格式化数据打印到标准输出 2.strlen(n);//string 获取字符串长度 3.time()//time 获取当前时间 4.sqrt()//math 计算平方根

这只是很少库函数的冰山一角,那这个时候大家可能就会有疑惑了,那这么多的库函数,咱们程序员记忆都这么好的吗?难道都是过目不忘吗?当然不是,这么多库函数当然要运用工具去查询

这是我推荐给大家的网站  cplusplus.com

点击搜索,输入函数即可搜索函数的使用方式以及头文件(后面会介绍),可以学习使用,小编亲测真的好用!

那可能又有小伙伴有疑问了,这么多库函数就可以随便使用了?并不是,每个库函数都属于不同的种类,调用每一个库函数都相当于借,借东西都应该和它的“主人”打个招呼——因此我们都会在文件开头打出它对应的头文件,例如:printf函数就要使用头文件stdio 。

2.1.2  自定义函数

那既然有了这么多好用的库函数了,那还要程序员干什么?随便叫一个人学两天不就可以胜任了吗?好问题,虽然有那么多库函数,但是依然还是有很多无法用库函数解决的问题,这时候就需要我们程序员发挥了 ,程序员通过编译代码来解决问题,这就是自定义函数。

例如:判断当前年份是否为闰年?

#include void Leap_yaer(int n) { if(n%4==0&&n/100!=0||n%400==0) { printf("Yes!"); } else { printf("No!"); } } int main() { int a; scanf("%d",&a); Leap_year(a); }

注:函数名应该与函数内容有关系,方便自己检查和他人理解。

        当函数无返回值时采用void,当函数需要返回值时,则使用int

三.  函数的传参

将数据传入函数中我们称这个过程为函数的传参,而传的参数又分为实参和形参

3.1  实参

实参:实际参数简称“实参”。在调用有参函数时,函数名后面括号中的参数称为“实际参数”,实参可以是常量、变量或表达式。

例如:比较两数的大小

#include int Max(int x, int y) { if (x > y) return x; else return y; } int main() { int a, b; scanf("%d %d", &a, &b); int c = Max(a, b); printf("%d\n", c); return 0; }

上述函数之中,Max(a,b)中的a和b就是实参。

3.2  形参

形参:自定义函数中的“形参”全称为"形式参数" 由于它不是实际存在变量,所以又称虚拟变量。实参和形参可以重名。

上述函数中Max(int x,int y)就是形参,形参并不具备实际含义,也并不影响实参,形参就就只是实参的一份临时拷贝,函数调用完成,形参也会跟着销毁,因此形参的作用域只在函数中有效。

四.  函数的调用

听到函数的调用,大家肯定在想调用不就是把值带进去吗?还讲什么?传值和传址读音的都一样,莫不是小编昏头了?打错了?并不是这样的,传值和传址两者的区别很大的。

4.1  传值调用

传值调用:将主函数中实参的值在函数中拷贝一份即为形参。形参并不会影响实参的值,临时拷贝的形参与实参的地址并不相同等到函数使用完成,形参也随之销毁,例如上面的比较两数大小就是传值调用。

4.2  传址调用

传址调用:将主函数中实参的地址传入函数,此时形参的变化也会影响实参,是两者之间真正的建立联系,形参改变,形参也跟着改变,可能大家还是不能理解,小编给大家举个例子。

#include int Exchange(int a, int b) { int tmp = a; a = b; b = tmp; } int main() { int a, b; scanf("%d %d", &a, &b); Exchange(a, b); printf("%d %d\n",a,b); return 0; }

为什么此时a和b并没有像我们想象中交换呢?就是因为我们采用的是传值而不是传址。形参的改变并不会影响实参,因此我们需要更改,如下:

#include int Exchange(int *a, int *b) { int tmp = *a; *a = *b; *b = tmp; } int main() { int a, b; scanf("%d %d", &a, &b); Exchange(&a,&b); printf("%d %d\n",a,b); return 0; }

此时可以看到a和b发生了改变,这便是传址调用。

注:因为是传址,因此a和b需要加上&(取地址符),int *取的是a和b的指针也就是地址。

五.  函数的嵌套调用和链式访问 5.1  函数的嵌套调用

函数的嵌套调用,顾名思义,嵌套嵌套,那不就是一个嵌着另一个,小伙伴们这么理解就对了,函数的嵌套调用就是一个函数中调用了另一个函数。例如:

#include int Max(int x, int y) { if (x > y) return x; else return y; } int Print(int x, int y) { int c = Max(x, y); return c; } int main() { int a, b; scanf("%d%d", &a, &b); int ret=Print(a,b); printf("%d", ret); return 0; }

 这就是函数的嵌套,打印a和b中较大的,Print就是打印,通过调用Max函数来判断两个数的大小。注意:函数可以嵌套使用但是不能嵌套定义!!!

 5.2  函数的链式访问

链式访问:把一个函数的返回值作为另一个函数的参数。例如:

#include int main { printf("%d,printf("%d",printf("%d",43))); return 0; }

 有没有小伙伴猜到是这个结果,下面小编给大家讲解一下为什么是4321,首先 printf("%d",43),它打印的结果就应该是43, printf("%d", printf("%d",43)这个时候打印的是printf("%d",43)的返回值,而打印出来的是43两位数,所以返回值是2,printf("%d", printf("%d", printf("%d",43)))这实打印的是printf("%d", printf("%d",43)的返回值就是2一位数,故而返回值是1打印的结果也就是我们最后看到的4321,小伙伴们看到了吗?c语言中的函数就是这么精彩。

六.  函数的声明与定义 6.1 函数声明

当我们写代码的时候如果用到我们定义的函数,但是如果我们在主函数之后写函数,我们知道函数在后面,但是计算机并不知道,因此我们需要跟计算打个招呼,说一声有个什么函数,需要返回吗,返回类型又是什么,因此我们常在程序开头写出函数的声明。

6.2 函数定义

我们会重新创建一个add.h的头文件用来放Add函数的声明,创建一个add.c的源文件放Add函数的定义(函数的实现)。当我们要在text.c中调用Add函数的时候只需要包含add这个头文件即可。(注意是用双引号)

这个add.h就是add函数的头文件,用来存放add函数声明,add.c则就是用于存放add函数的定义。为什么要弄得如此复杂?难道要在一个庞大工程里面创建多个头文件(.h),和多个.c文件吗?

因为一个大的工程往往是由多人共同完成的,每个人都有各自的任务和职责,最后要将它们的代码都整合起来,最后完成整个项目。而不是今天你来,明天我来,那样效率是不是太低了呢?也更容易出现错误。

七. 递归与迭代 7.1 递归

什么是递归?递归就是将一个复杂的问题拆分成多个简单的小问题,这样子会减少大量的代码量,使的代码看的简洁明了,例如:

#include void reverse(char* str) { int len = strlen(str); char temp = *str; *str = *(str + len - 1); *(str + len - 1) = '\0'; if (strlen(str + 1) >= 2) { reverse(str + 1); } *(str + len - 1) = temp; } int main() { char str[] = "abcdef"; int len = strlen(str); reverse(str); int i = 0; for (i = 0; i < len; i++) { printf("%c ", str[i]); } return 0; }

很多问题既可以用递归也可以用循环来写,同样是上面这个题

#include void reverse_string(char* arr) { char* left = arr; char* right = arr + strlen(arr) - 1; while (left < right) { char tmp = *left; *left = *right; *right = tmp; left++; right--; } } int main() { char arr[] = "abcdef"; reverse_string(arr); printf("%s", arr); return 0; }

 

结果可见也是正确的。

7.2 迭代

迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。

重复执行一系列运算步骤,从前面的量依次求出后面的量的过程。此过程的每一次结果,都是由对前一次所得结果施行相同的运算步骤得到的。例如利用迭代法*求某一数学问题的解。

对计算机特定程序中需要反复执行的子程序*(一组指令),进行一次重复,即重复执行程序中的循环,直到满足某条件为止,亦称为迭代。迭代简单来讲就是循环,但是递归是函数不断的调用自己,以旧值推新值的过程。

讲到这里小编也将函数的知识大概讲完了,希望可以对小伙伴们的学习能有所帮助,学习知识真是让人太满足了。

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3