1 复习函数
1 函数组成
函数原型:告诉编译器函数的类型。和变量一样,任何函数使用前都要先声明类型;
函数调用:表明在此处执行函数;
函数定义:即使函数的具体实现,明确的指定了函数要做什么。
2 定义带形式参数的函数
3 声明带形式参数函数的原型
// 方式一
void show_n_char(char ch, int num); // 声明函数原型
// 方式二
void show_n_char(char, int); // 省略变量名
4 调用带实际参数的函数
5 使用 return 语句返回值
关键词 return 后面的表达式的值,就是函数的返回值。
return 可以返回变量值,表达式的值;使用 return函数的另一个作用,终止函数,因此可以在函数中使用多个 return 语句
// return 返回变量的值
int min(int num1, int num2)
{
int min_num;
if (num1 < num2)
min_num = num1;
else
min_num = num2;
return min_num;
}
// return 返回表达式的值
int min(int num1, int num2)
{
return (num1 < num2) ? num1 : num2;
}
// 在函数中使用多个 return
int min(int num1, int num2)
{
if (num1 < num2)
return num1;
else
return num2;
}
2 递归
1 递归介绍
简单的递归程序:
#include <stdio.h>
void up_and_down(int n);
int main(void)
{
up_and_down(1);
return 0;
}
void up_and_down(int n)
{
printf("Level %d: n location %p\n", n, &n);
if (n < 4)
up_and_down(n + 1);
printf("Level %d: n location %p\n", n, &n);
}
执行结果:
2 汉诺塔递归程序
/**
* @brief 参考链接:https://blog.csdn.net/weixin_42145502/article/details/83686673
*/
#include <stdio.h>
void move(char ch1, char ch2);
void hanoi(int n, char A, char B, char C);
int main(void)
{
hanoi(8, 'A', 'B', 'C');
return 0;
}
void move(char ch1, char ch2)
{
printf("%c ---> %c\n", ch1, ch2);
}
void hanoi(int n, char A, char B, char C)
{
if (n == 1)
move(A, C);
else
{
hanoi(n - 1, A, C, B);
move(A, C);
hanoi(n - 1, B, A, C);
}
}
3 尾递归
尾递归,就是将递归调用置于函数的末尾。这是最简单的递归形式,相当于循环。
// 递归计算阶乘
long rfact(int n)
{
long ans;
if (n > 0)
ans = n * rfact(n - 1);
else
ans = 1;
return ans;
}
4 递归函数的优缺点(使用简单,但消耗内存)
3 指针
1 取地址运算符 &
执行结果
由于函数调用,传递的是值,那么原则上子函数无法更改主调函数的变量。怎么解决?使用指针传递地址。
2 指针简介
什么是指针?从根本上看,指针(pointer)是一个值为内存地址的变量。正如 char 类型变量的值是字符,int 类型变量的值是整数,指针变量的值是地址。
一个指针占几个字节?
因为指针存储的是地址,那么在32位系统中,指针占据4字节;63位系统中,指针占据8字节。
3 声明指针变量
int * pi; // pi 是指向 int 类型变量的指针
char * pc; // pc 是指向 char 类型变量的指针
float * pf, * pg; // pf 和 pg 都是指向 float 类型变量的指针
注意,* 和 指针名之间的空格可有可无。通常,程序员在声明时使用空格,在解引用变量时省略空格。
4 使用指针在函数间通信
#include <stdio.h>
void interchange(int * u, int * v);
int main(void)
{
int x = 5, y = 10;
printf("Originally x = %d and y = %d.\n", x, y);
interchange(&x, &y); // 把地址发送给函数
printf("Now x = %d and y = %d.\n", x, y);
return 0;
}
void interchange(int * u, int * v)
{
int temp;
temp = *u;
*u = *v;
*v = temp;
}
函数传递值和传递指针的区别