·函数
(函数名,返回类型,函数参数)
-常见函数类型
-库函数
-IO函数
-字符串操作函数
-字符操作函数
-内存操作函数
-时间/日期函数
-数学函数
-其他库函数
-自定义函数
-设计一个函数交换两个整形的值
-用指针远程操纵两个整型
//交换两个整型的值
#include<stdio.h>
void Swap(int* a, int* b)
{
int tmp = 0;
tmp = *a;
*a = *b;
*b = tmp;
}
int main(void)
{
int a = 10;
int b = 20;
printf("a=%d,b=%d\n", a, b);
Swap(&a, &b);
printf("a=%d,b=%d\n",a, b);
}
·参数
-实参
实际参数,可以是常量,变量,表达式和函数
-形参
形式参数,只有在函数被调用时才被实际化,然后被销毁
-*当实参传给形参时,形参是实参的一种临时拷贝,对形参的修改不会影响实参
-文档和库的阅读
strcpy() : char * strcpy ( char * destination, const char * source )
memset() :void * memset ( void * ptr, int value, size_t num );
常用工具:cplusplus、cppreference
·函数的调用
-传值调用
形参和实参分别占用不同的内存块,对形参的修改不会影响实参
-传址调用
可以让函数内部的变量和函数外部变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量
·保证函数的可适用性和可移植性
·数组在传参时传递的是数组首元素的地址
-无法在函数内部求数组的元素个数
·函数的嵌套调用
·函数的链式访问
将一个函数的返回值作为另一个函数的参数
·printf的返回值是所打印字符的个数
·若函数定义在函数调用之后,需要先声明
-把函数的声明放在.h文件中,把函数的定义放在.c文件中
·函数递归
-函数自己调用自己称为递归
-递归常见的错误:栈溢出(stack overflow)
-大事化小
-按顺序打印一个整型的每一位
//接受一个整型值,按顺序打印它的每一位
#include<stdio.h>
void print(int i)
{
if (i>9)
{
print(i / 10);
}
printf("%d ", i % 10);
}
int main(void)
{
int i = 0;
printf("请输入一个整数 i=");
scanf("%d", &i);
print(i);
return 0;
}
-递归存在两个必要条件
1. 存在限制条件,当满足该限制条件时,递归不再继续
2. 每次递归调用之后越来越接近这个限制条件
-不引入临时变量,求字符串的长度
//不引入临时变量,求字符串长度
//#include<stdio.h>
//
//int my_strlen(char* str)
//{
// if (*str != '\0')
// {
// return 1 + my_strlen(str + 1);
// }
// else
// {
// return 0;
// }
//}
//
//int main(void)
//{
// char arr[] = "abc";
// my_strlen(arr);
// int len = my_strlen(arr);
// printf("len=%d", len);
// return 0;
//}
·汉诺塔问题
//汉诺塔问题求解
#include<stdio.h>
void move(char x, char y)
{
printf("%c --> %c\n", x, y);
}
void Hanoi(int n, char a, char b, char c)
{
if (n == 1)
{
move(a, c);// n=1,直接将其从A移动到C
}
else
{
Hanoi(n - 1, a, c, b);// 将1到n-1以C为媒介从A移动到B
move(a, c); // 将n从A移动到C
Hanoi(n - 1, b, a, c);// 将1到n-1以A为媒介从B移动到C
}
}
int main(void)
{
printf("请输入 n=");
int n = 0;
scanf("%d", &n);
printf("移动步骤如下:\n");
Hanoi(n, 'A', 'B', 'C');
return 0;
}
·青蛙跳台阶问题
//青蛙跳台阶问题求解
#include<stdio.h>
int Jump(int n)
{
if (n == 0||n == 1)
{
return 1;
}
else
{
return Jump(n - 1) + Jump(n - 2); //若最后一次跳1个台阶,则有 Jump(n-1) 种跳法,
//若最后一次跳2个台阶,则有 Jump(n-2) 种跳法
} //故共有 Jump(n-1) + Jump(n-2) 种跳法
}
int main(void)
{
int n = 0;
printf("请输入台阶数 n=");
scanf("%d", &n);
int ret=Jump(n);
printf("共有%d种跳法\n", ret);
return 0;
}