函数的传参与调用,传值调用
此方法是传值调用,形参是实参的一份临时拷贝,传值调用在自己建立的函数改变参数的值,是不能改变外部函数的值的
传址调用
传址调用是可以在自己建立的函数从而改变掉main()中的值,传址可以改变了外部函数的数的值的
原理
数组
-
什么是数组?? ---一组相同类型元素的集合
-
怎么存储1-10的数字,怎么存储
3.数组的下标
C语言规定:数组的每一个元素都有一个下标,下标都是从0开始的。数组还可以通过下标来访问。
这个是以5的下标来访问的
1.函数的嵌套调用和链式访问👀
#include <stdio.h>
void new_line()
{
printf("hehe\n");
}
void three_line()//分装了new_line()
{
int i = 0;
for(i=0; i<3; i++)//调用了3次new_line()
{
new_line();
}
}
int main()//要打印产生效果就要主函数再来调用three_line()
{
three_line();
return 0;
}
注意:函数可以嵌套调用,但是不能嵌套定义。如图:
此写法是正确的。
这个就不对了,A函数里面定义了B函数,嵌套定义了,这是绝对不允许的
2.链式访问👻
如图就是链式访问
打印4321,最里面的printf先打印43,因为printf返回类型是int,当成功运行时返回值是字符的个数,就如下图,先打印43的prinf,'4'和 '3'是两个字符,所以返回值两个字符所以第二个printf打印2,同理2是一个字符,所以第三个printf打印的是1.所以连起来就是4321
链式访问:把一个函数的返回值作为另外一个函数的参数。
#include <stdio.h>
#include <string.h>
int main()
{
char arr[20] = "hello";
int ret = strlen(strcat(arr,"bit"));//这里介绍一下strlen函数
printf("%d\n", ret);
return 0;
}
#include <stdio.h>
int main()
{
printf("%d", printf("%d", printf("%d", 43)));
//结果是啥?
//注:printf函数的返回值是打印在屏幕上字符的个数
return 0;
}
2. 函数的声明和定义👀
test.h自己建立的头文件
#ifndef __TEST_H__
#define __TEST_H__
//函数的声明
int Add(int x, int y);
#endif //__TEST_H__
test.c负责函数的具体实现的文件
#include "test.h"
//函数Add的实现
int Add(int x, int y)
{
return x+y;
}
3.函数递归👀
1. 什么是递归?👻
最简单的递归,main自己调用了自己
程序调用自身的编程技巧称为递归( recursion)。
递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的
一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量
刚刚的代码在死循环中停下来了。
死循环打印最终停了下来,错误在于栈溢出
递归执行时,main递归一次就要向栈区申请一定空间,但是上面代码一直死循环就一直向栈区申请空间直到把栈区消耗完就会报错。
递归的主要思考方式在于:把大事化小
2 .递归的两个必要条件👻
1.存在限制条件,当满足这个限制条件的时候,递归便不再继续。
2.每次递归调用之后越来越接近这个限制条件
3.练习1👻
接受一个整型值(无符号),按照顺序打印它的每一位。
例如:
输入:1234,输出 1 2 3 4
逻辑图:
递归
递——>递推
归——>回归
输入1234 函数开始递归中的“递”,刚开始n=1234,经过Get(n/10)推递得到了n=123以此类推,最后得到了n=1,此时n=1不满足if(n>9),“递”就停止了。然后开始“归",第一次”归“
中n=1,经过n%10得到 1,所以屏幕上打印的第一个是1 的二次的”归“是n=12,经过n%10得到2所以屏幕上打印的第二个就是2,以此类
推最终屏幕上打印会是1 2 3 4
4.练习2👻
编写函数不允许创建临时变量,求字符串的长度。
我自己照猫画虎的模拟了一个strlen函数的实现过程,如下图的全过程
4.递归与迭代
1.练习👻
求n的阶乘(不考虑溢出)
另外的思想就递归思想
int fact(int n)
{
if(n <= 1)
return 1;
else
return n * fact(n-1);
}
逻辑如图
2.练习2👻
求第n个斐波那契数。(不考虑溢出)
就是前两个数相加等于后面的那个数
如果你输入一个很大的数,程序会运行很慢,因为数太大了,效率低
所以下迭代的方法:
输入50的时候瞬间完成了计算,但是结果错误,因为数太大溢出了,没有记错的话整型的最大值是21亿多