Bootstrap

【比特鹏哥C语言_3.函数】

本章主要要掌握函数的基本使用和递归
目录:

  1. 函数是什么
  2. 库函数
  3. 自定义函数
  4. 函数参数
  5. 函数调用
  6. 函数的嵌套调用和链式访问
  7. 函数的声明和定义
  8. 函数递归

一、函数是什么

C语言中的函数的定义是:子程序

  1. 子程序是一个大型程序中的某部分代码,由一个或多个语句块组成。它负责完成某项特定的任务,而且相较于其他代码,具备相对独立性
  2. 一般会有输入参数并有返回值,提供对过程的封装和细节的隐蔽,这些代码通常被集成为软件库

C语言中函数的分类:

  1. 库函数
  2. 自定义函数

二、库函数

为什么会有库函数?
基础功能,会被频繁使用,为了提高工作效率,所以C语言的基础库中提供了一系列类似的库函数,方便程序员进行软件开发。

1.怎么学习库函数

可以参考这些网站:
www.cplusplus.com
查询工具:
MSDN(Microsoft Developer Network)
www.cplusplus.com
http://en.cppreference.com
http://zh.cppreference.com(中文版)

使用文档来学习库函数步骤

举例1:学习函数strcpy
在这里插入图片描述

int main()
{
   
	char arr1[20]={
   0};//目标
	char arr2[ ]="hello bit";//源码
	strcpy(arr1,arr2);//将源码的字符串拷贝给目标
	printf("%s",arr1);//打印arr1这个字符串 %s - 以字符串的格式来打印
	return 0;
}
//输出结果:

举例2:学习函数memset
在这里插入图片描述
在这里插入图片描述

int main()
{
   
	char arr[]="hello bit";
	memset(arr, 'x', 5);//将arr数组中前五个字符填充成x
	printf("%s\n",arr);
	return 0;
	//结果输出:xxxxx bit
}

2.C语言常用库函数

  1. IO函数(即输入/输出函数:printf、scanf、getchar、putchar)
  2. 字符串操作函数(strcmp、strlen)
  3. 字符操作函数(toupper)
  4. 内存操作函数(memcpy、memcmp、memset)
  5. 时间/日期函数(time)
  6. 数学函数(sqrt、pow)
  7. 其他库函数

三、自定义函数

自定义函数和库函数一样,有函数名,返回类型和函数参数。但不一样的是,这些要我们自己去设计。
注意:设计函数是一定要保证函数的功能足够单一,如果函数功能冗杂,会导致使用者应用方面变窄,不易于调用

1.函数的组成

ret_type fun_nume(para1, para2 , ...)
{
   
	statement;//语句块
}
// ret_type 返回类型
// fun_name 函数名
// paral    函数参数

\ ******* 举例 ******* \

1.写出一个函数可以找出两个整数中的最大值
函数的return只能返回一个值

get_max(int x, int y)
{
   
	int z = 0;
	if (x > y)
		z = x;
	else
		z = y;
	return z;//返回z -返回较大值
}
int main()
{
   
	int a = 10;
	int b = 20;
	//函数调用
	int max = get_max(a, b);
	printf("max=%d\n", max);
	return 0;
}
  1. 写一个函数可以交换两个整形变量的内容
    临时变量的作用:
    在这里插入图片描述
/***************出问题的代码*******************/
//函数返回类型的地方写出:void,表示这个函数不返回任何值,也不需要返回值
void Swap(int x, int y)
{
   
	int z = 0;//临时变量
	z = x;
	x = y;
	y = z;
}
int main()
{
   
	int a = 10, b = 20;
	//写一个函数,交换2个整型变量的值
	printf("交换前:a=%d b=%d\n", a, b);
	Swap(a, b);
	printf("交换后:a=%d b=%d\n", a, b);
	return 0;
}
//输出结果:
//交换前:a=10 b=20
//交换后:a=10 b=20

上串代码并没有实现应有的功能
原因是:a、b变量各自有各自所占的内存(空间),将a、b的值传给Swap函数,并不会连同地址传过去,Swap函数中x、y接过值后进行计算,计算完后x、y的值发生变化,并将值传给了x、y各自所在的内存,并没有影响到a、b,所以a,b的值并没有变化,所以最终没有达到交换的效果
在这里插入图片描述
更通俗的解释:形参实例化之后其实相当于实参的一份临时拷贝
在这里插入图片描述

解决办法:用指针
先简单复习指针的概念:

int main()
{
   
	int a=10;//a占8个字节的空间(64位系统)
	int* pa = &a;//&是取地址符号,将a的地址赋给pa,
	//pa就是一个指针变量,a是整型int,因此pa也是整型,为pa*
	*pa=20;//对pa解引用,那么*pa就是a
	printf("%d\n,a);
	return 0;
}
//输出结果:20

正确代码如下:

//正确代码是指针将自建函数和主函数联系了起来
//函数返回类型的地方写出:void,表示这个函数不返回任何值,也不需要返回值
void Swap(int* pa, int* pb)//a、b将地址传给指针变量pa、pb
{
   
	int z = 0;//临时变量
	z =*pa;//*pa就是a
	*pa= *pb;
	*pb=z;
}
int main()
{
   
	int a = 10, b = 
;