函数(c语言进阶)
目录
一.库函数
1.使用库函数的步骤
memset函数
Strcpy函数
二.函数的定义:
实例1:写一个函数求最大值
三.函数的参数
四.函数的传值调用和传址调用
1.传值调用
实例:判断是否为闰年,用函数写
2.传址调用
实例:交换俩个数的值,通过函数来实现
五.函数的嵌套调用和链式访问
1.嵌套调用
2.链式访问
六.函数的声明
函数的声明
编辑
函数的定义
七.函数的递归
递归的限制条件
例题1:斐波那契数列的实现
例题2:字符串的逆序,使用函数递归实现
例题3:打印数字的每一位
一.库函数
在 C 语言中,库函数是指预先定义并编译好的函数,这些函数可以被程序员在其代码中调用。这些函数在不必重新编写代码的情况下提供了常用功能,从而提高了编程的效率和方便性。
1.使用库函数的步骤
包含头文件:在代码中使用
#include
指令包含相关的头文件。例如:#include <stdio.h>
调用库函数:直接调用库函数,就像调用任何其他函数一样。例如:
printf("Hello, World!\n");
举例
memset函数
#include<string.h>
#include<stdio.h>
int main()
{
char arr[] = { "Hello World" };
//第一个目标对象
//修改内容
//修改范围
memset(arr, 'X', 5);
printf("%s", arr);
return 0;
}
Strcpy函数
这个函数具有拷贝功能,能把\0拷贝过来
#include<string.h>
#include<stdio.h>
int main()
{
char arr1[] = { "Hello World" };
char arr2[20] = {"#######"};
//arr2 拷贝目标
//arr1 拷贝对象
strcpy(arr2, arr1);
printf("%s", arr2);
return 0;
}
程序运行
二.函数的定义:
返回值类型 函数名(参数类型1 参数名1, 参数类型2 参数名2, ...)
{
// 函数体
}
实例1:写一个函数求最大值
//函数的定义
int Max(int a, int b)
{
if (a > b)
{
return a;
}
else if (a < b)
{
return b;
}
else
{
return a;//或者return b
}
}
//return会把值返回到函数调用的部分
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int num =Max(a, b);//函数的调用
printf("%d ", num);
return 0;
}
三.函数的参数
实参:真实传给函数的参数
实参可以是常量,表达式,变量,函数等。
无论实参是何种类型的值,在函数调用的时候,都必须要有确定的值,以便传给形参
形参:是指函数名后括号中的变量,因为形式参数只有在函数调用的时候实例化,所以叫形式参数
,形式参数当函数调用后就自动销毁了。因此,形式参数只有在函数内才有效
四.函数的传值调用和传址调用
1.传值调用
特征
传值调用时,函数接收的是参数的副本
修改函数内部的参数不会影响到实参
实例:判断是否为闰年,用函数写
int year(a)
{
if (a % 4 == 0 && a % 100 != 0 || a % 400 == 0)
{
printf("闰年");
}
else
{
printf("平年");
}
}
int main()
{
int a = 0;
printf("请输入年份\n");
scanf("%d", &a);
year(a);
return 0;
}
2.传址调用
1.传址调用传递的是参数的地址,允许函数直接访问和修改原数据(实参)
2.通过指针来实现
实例:交换俩个数的值,通过函数来实现
错误示范
写完之后,诶,他俩的值并没有发生变化。
解释
由图可得
实参和形参的地址不一样,对形参的修改并不会改变实参的值,这是一种传值调用
如果使用传址调用的,形参和实参的地址一样,也就是说对形参的修改会影响到实参的值。
正确代码:
int Swap(int*pa, int*pb)
{
int temp = *pa;
*pa=*pb ;
*pb= temp;
}
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
printf("交换前\n");
printf("a=%d b=%d\n", a, b);
int result =Swap(&a, &b);
printf("交换后\n");
printf("a=%d b=%d",a,b);
return 0;
}
代码运行
五.函数的嵌套调用和链式访问
1.嵌套调用
函数可以嵌套调用,不能嵌套定义
2.链式访问
把一个数的返回值当作另外一个数的参数
注意:
printf函数的返回值是int
六.函数的声明
函数先声明后使用
函数的声明
函数的定义
七.函数的递归
递归的限制条件
1.存在限制条件,当满足这个条件后,递归便不再继续。
2.每次递归调用后越来越接近这个条件,
例题1:斐波那契数列的实现
int f(int n)
{
if (n ==1 || n==2)
{
return 1;
}
else
{
return f(n - 1) + f(n - 2);
}
}
int main()
{
int num = 0;
scanf("%d", &num);
int result =f(num);
printf("%d ", result);
return 0;
}
函数递归的过程
例题2:字符串的逆序,使用函数递归实现
void reverse(char arr[], int a)
{
if (a < 0)
{
return;
}
purchar(arr[a]);
//函数的递归
reverse(arr, a - 1);
}
int main()
{
char arr[] = "abcdef";
int sz = sizeof(arr) / sizeof(arr[0]);
int a = sz - 2;
//sz表达式计算出来字符串的元素个数,包含\0,
//又因为数组的下标是从0开始的.因为sz-2
reverse(arr, a);
return 0;
}
例题3:打印数字的每一位
void print(int a)
{
if (a == 0)
{
return;
}
//函数先通过递归
print(a / 10);
//然后再打印每个数字,'0'是转换成字符
putchar((a % 10) + '0');
}
int main()
{
int a = 0;
printf("请输入一个数");
scanf("%d", &a);
print(a);
return 0;
}