#define _CRT_SECURE_NO_WARNINGS
//----------------------------------------------------------------------------------------------------------第三章. 函数
/*
1 函数是什么
2 C语言中函数的分类
3 函数的参数
4 函数的调用
5 函数的嵌套调用和链式访问
6 函数的声明和定义
7 函数递归
*/
#include <stdio.h>
#include <string.h>
//------------------------------------------------------------------------------------------------------------1 函数是什么
// 子程序
// 是一个大型程序中的某部分代码,由一个或者多个语句块组成。负责完成某项特定任务,相较于其他代码,具有相对的独立性
// 一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏,这些代码通常被集成为软件库
//---------------------------------------------------------------------------------------------------2 C语言中函数的分类
//---------------------------------------------------------------------------------------------------2.1 库函数
// C语言里自带的函数,包括 函数名,返回类型,函数参数
// 库函数的使用必须包含对应的头文件
/*
求字符串长度 --strlen
比较两个字符串大小 --strcmp
......
*/
/* 库函数分类
IO函数
字符串操作函数 string.h
字符操作函数
内存操作函数
时间/日期操作函数
数学函数
其他库函数
*/
//--------------------------------------------举例1:strcpy (string.h)
//int main()
//{
// char arr1[20] = { 0 };
// char arr2[] = "hello bit";
// strcpy(arr1, arr2); // copy命令,把 后者arr2 的数据复制给 前者arr1
// printf("%s\n", arr1); //输出 hello bit
// printf("%s\n", arr2);
//
// return 0;
//}
//--------------------------------------------举例2:memset (string.h)
// 内存 设置
//int main()
//{
// char arr[20] = "hello bit";
// memset(arr, 'x', 5); // 把 arr 里的前 5 个字符改成 x
// printf("%s\n", arr); //输出 xxxxx bit
//
// memset(arr+6, '*', 2); // 从 arr 里的 第 6 个字符起 数 2 个字符 ,改成 *
// printf("%s\n", arr); //输出 xxxxx **t
// return 0;
//}
//--------------------------------------------------学习库函数工具
/*
MSDN (Microsoft Developer Network)
https://cplusplus.com
https://cplusplus.com/reference/ (学习库函数)
https://en.cppreference.com (英文版)
https://zn.cppreference.com (中文版)
*/
//------------------------------------------------------------------------------------------------2.2 自定义函数
// 和库函数一样,包括 函数名,返回类型,函数参数
/* 函数组成语法
ret_type fun_name(para1,*)
{
statement; (函数体)
}
*/
// ret_type 返回类型 (int / void)
// fun_name 函数名
// para1 函数参数1(可以没有,一个,多个)
//--------------------------------------------举例1:求两个整数较大值
//int GET_MAX(int x, int y) //函数的自定义
//{
// return(x > y ? x : y); //三目操作符
//}
//
//int main()
//{
// int a = 0;
// int b = 0;
// scanf("%d", &a);
// scanf("%d", &b);
// int max = GET_MAX(a, b); //调用函数(自定义)
// printf("%d\n", max);
//
// return 0;
//}
//--------------------------------------------举例2:写一个函数可以交换两个整型变量的内容 (错误版)
/*
Swap(int x, int y) //函数定义
{
int z = 0;
z = x;
x = y;
y = z;
}
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
printf("交换前: a=%d b=%d\n", a, b); //10 20
//调用函数来交换
Swap(a, b); // 只需要交换,不需要返回,所以不用 int
// a 和 b 叫实参,函数里的 x y 叫形参(形式参数)
// 实参ab传给形参xy时,形参只不过是实参的一份临时拷贝,只拷贝过去了数据,但是实参的独立空间还在
// 所以修改形参,不会影响实参
printf("交换后: a=%d b=%d\n", a, b);//10 20 ---------------------------(交换失败)
return 0;
}
*/
//int main()
//{
// int a = 0;
// int* p = &a;
// a = 20;// 直接改
// *p = 30;// 通过地址,间接改
//
// return 0;
//}
//--------------------------------------------举例2:写一个函数可以交换两个整型变量的内容 (正确版)
Swap(int* px, int* py) //把地址所指向的内容的值交换
{
int z = *px; //z=a
*px = *py; //a=b
*py = z; //b=a
}
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
printf("交换前: a=%d b=%d\n", a, b); //10 20
// Swap(a, b);
Swap(&a, &b); //把地址所指向的内容的值交换
printf("交换后: a=%d b=%d\n", a, b);// 20 10----------------------交换成功
return 0;
}