- 任何一个代码都有函数组成,函数非常重要
- 函数是什么
数学中f(x) = 2x+1
以及在cs中函数的标准定义
一般函数有输入参数和返回值
甚至提供对过程的分装和隐藏,这些代码被集成为软件库
- 函数的分类
库函数和自定义函数- 库函数
但是当我们写代码时发现,大量功能重复使用,时间都浪费了
把频繁大量使用的导出来也会让让我们更加标准,库函数是一系列函数
standard output也就是stdout标准输出就是键盘,网站推荐
www.cplusplus.com还可以查c++的
还有msdn还有c++和c的官方中文网站zh.cppreference.com
所以呢,我们怎么使用文档来学习库函数
比如strcpy
目的地,将arr1拷贝到arr2里去
打印字符串%s hello bit
memory - 记忆- 内存
,memset--内存设置
更加标准和效率化库函数功能有限
- 自定义函数
- 函数的基本原型和函数的组成:库函数和自定义函数类型相似,模仿去用它
函数返回类型加函数名加函数的参数
- 写个函数,找出两个数的最大值
写函数名 get_max(a,b);
int max = get_max(a,b);
这是函数的调用
现在要函数的定义
设置函数的参数
函数体要做的就是正经事
它会return谁?
main函数就是我
get_max是张三
我说:张三你把两个数比较
我说:帮我带份饭:蛋炒饭,20元
带饭(蛋炒饭,20元) -----传参
最后要给我返回来一份饭
返回的z和带回来的饭是一个道理
一个一个按f11
- 写一个函数,交换两个整形的内容
Swap函数(a,b);
然后要设计参数
一会只要a和b内容,不用返回
什么都不用返回就用void
函数返回类型的地方写void;表示不返回任何值,也不需要返回
怎么交换,引入临时变量
比如酱油和醋怎么交换,我们要借一个空瓶
出问题了,没有交换没有完成任务
取地址a和取地址b
其实他们在内存开辟了b空间和a空间
a空间的编号b空间的编号
地址不一样
调用函数的时候我们又为y和x创建了独立空间
不会影响主函数a和b
空间不一样,代码写出问题
现在我们担心的是调用函数和函数内部没有关系
我们前面学习指针概念>>>>>>复习
int a 10; 升起一个四个字节的空间
int * pa = =&a pa就是一个指针变量
pa要找到a *pa就是a
*pa = 20 a就是20;
我们把a和b的地址,类型就匹配上了
pa和pb未来是可以找到a和b的
这样我们把swap函数的内部与外部的调用去进行联系
*pa访问的就是a
通过远程的pa与pb进行调用
仔细看: 指针变量的大小的固定的
我们把a和b的指针放入pa和pb
有朝一日我们就拿到这两个地址进行a和b的调用
这就是指针的作用
注意有void不要有return x;除非return;
什么情况我们传地址过去
函数内部和函数外部要进行联系
- 函数的参数
- 实参
.int max = get_max(2+5,3);
确定的值2+5等于7,我们确定把7传给函数定义的形参
- 形参
但函数只定义,没有调用使用,没有分配内存单元
不用为参数分配空间,就是个摆设,形参
只有在调用时才分配空间
出来的时候x和y销毁
形参的生命周期和局部变量一样
swap1在被调用的时候,实参穿给形参
其实形参是实参的一份拷贝
改变形参,不会改变实参
swap2之间的形参和实参有联系
- 实参
- 函数的调用
- 传值调用
把变量本身传过去了
- 传址调用
进行了取地址
可以让函数和函数外部的变量建立起真的联系
- 练习1.写一个数,判断他是不是素数,打印100到200之间的素数
关键是判断i是不是素数
我们要创立一个函数去判定函数名是is_prime
is_prime(int n);
函数功能要单一
- 练习2.写一个函数判断一年是不是闰年
for循环
is_leap_year函数名
还有返回类型int
测试通过了,但不规范
一个函数如果不写返回类型,默认返回int类型
void也是类型,空类型,不需要返回
- 练习3.实现一个整形数组的二分查找
函数名:binary_search
找到了就返回找到位置的下标
找不到就返回-1;因为下标不可以为-1,下标从0开始
参数几个?三个!数组的元素
返回下标
形参和实参名字可相同可不相同
12345678910下标分别是0和9
二分查找
int left =0
int right = s -1;就得到0和9
a[mid]中间元素
a[mid> k]
要多次二分查找用while循环
arr[]什么也不是
形参是这样写的int a[]
只是告诉我们这是一个数组
数组arr传参,实际上传递的不是数组本身
仅仅传过去了数组首元素的地址
int a[] 就是一个指针
整形的地址就是一个指针
本质上是指针
所以sizeof[a]就是四
sizeof(a[0])就是四
四除以四就是一
所以算数组元素个数要在main函数执行
一定要先求好,不要在函数内部求
- 传值调用
- 函数的基本原型和函数的组成:库函数和自定义函数类型相似,模仿去用它
- 第四题,每调用一次函数,就会将num的值增加一
Add函数
int num = 0;
Add函数每次调用num就会增加一;
注意add函数想改变我们的num,那我们只能把num的地址传过去,否则函数内部如何改变函数外部的量;
所以一定把地址传过去Add(&num);
void Add(int*p){
(*p)++;
}
- 库函数
- 函数的嵌套调用和链式访问
我们不能对函数进行嵌套定义
每一个函数都要在大括号内独立存在,函数之间是平等的
- 但函数可以嵌套调用
就是在main函数和test函数进行调用
你调用她,她调用你,互相调用
- 链式访问
解释:假设求字符串的长度
两个例子
最后一个为什么?
printf返回值类型是int,并且函数返回的是是打印在屏幕上的字符的个数
先在屏幕上打印出43,然后43个两位数,打印2
2是一位数,在屏幕上打印1
答案是4321
- 但函数可以嵌套调用
- 函数的声明和定义
- 函数的声明和定义
编译器是从前往后扫描
在使用之前先告知
先声明后使用
后面写代码都是分模块去写的
写一个计算机
程序员A B C加法交给A 乘法交个B
加法写了add.h 和add.c
总管来集成
每个人写自己的代码,函数声明放在头文件
各司其职
定义放在.c文件中
假设程序员E不会写加减乘除,买个别人的
卖给被人,不给他源码
保密,配置类型>>静态库
sub.lib就是静态库文件
静态库都是乱码
把静态库和.h文件卖给程序员E
卖给人家,得告诉人家怎么用,建立现有项的sub.h文件以后
不能跑起来
要导入静态库
#pragma comment(lib,"sub.lib")
为什么就跑起来了呢
当我们把一个代码的声明与实现分别放在.h和静态库文件时,就隐藏了
函数的定义是交代函数的功能实现和函数的具体实现
- 对以后的内容的延伸,三子棋和扫雷
还有应用
- 函数的声明和定义
函数是什么,以及函数的申明以及定义
最新推荐文章于 2024-10-11 21:38:42 发布
本文深入解析函数在编程中的核心概念,包括基本定义、分类(库函数与自定义函数)、参数传递(传值与传址)、调用示例、嵌套与链式访问。重点讲解了如何利用库函数提高代码效率,自定义函数的编写技巧以及函数声明与定义的组织方式。
摘要由CSDN通过智能技术生成