- 函数的声明和定义:
(1)函数声明:类型 函数名(参数);
1)告诉编译器有一个函数叫什么、参数是什么、返回类型是什么;但具体是否存在,无关紧要
2)函数声明出现在函数使用之前(先声明后使用)
3)函数声明一般放在头文件中(.h文件)
(2)函数定义:指函数的具体实现,交代函数的功能实现
/* test.c 文件 */
#include "ADD.h"
int Add(int x, int y);//函数的声明:可以用,但不适合
int main()
{
int a = 10;
int b = 20;
int sum = 0;
int sum1 = 0;
sum = Add(a, b);
sum1 = ADD(a, b);
printf("sum=%d\n", sum);
printf("sum1=%d\n", sum1);
return 0;
}
int Add(int x, int y)//函数的定义
{
int z = x + y;
return z;
}
/* ADD.c 文件*/
#include <stdio.h>
int ADD(int x, int y)//函数的定义
{
int z = x + y;
return z;
}
/* ADD.h 文件*/
#ifndef __ADD_H__ //#ifndef :if not define
#define __ADD_H__
int ADD(int x, int y);// 函数声明的正确用法
#endif
- 函数递归:程序调用自身的编程技巧——>大事化小
一个过程或函数在其定义或说明中有直接或间接的调用自身。
把一个大型复杂的问题层层转化为一个与原问题相似,规模较小的问题来解决
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
////函数递归:大事化小
//void pr(int n)
//{
// if (n > 9)
// {
// pr(n / 10);
// }
// printf("%d ", n % 10);
//}
//int main()
//{
// //printf("hehe\n");
// //main(); //递归常见错误:出现栈溢出
// //接受一个整型值,顺序打印每一位
// unsigned int num = 0;
// printf("输入一个数:");
// scanf("%d", &num);
// //递归
// pr(num);
// return 0;
//}
- 递归的两个必要条件:
(1)存在限制条件:当满足限制条件时,递归不再继续。
(2)每次递归调用后越来越接近递归限制条件。
//// 编写代码求字符串长度,不允许
#include <string.h>
int my_strlen(char* str)
{
int count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
int my_strlen1(char* str)//递归的方法
{
if (*str != '\0')
{
return 1 + my_strlen1(str + 1);
}
else
{
return 0;
}
}
int main()
{
char arr[] = "hello world";
int len = my_strlen(arr); //arr是数组。数组传参:传过去的不是整个数组,而是首元素的地址
int len1 = my_strlen1(arr);
printf("len=%d\n", len);
printf("len1=%d\n", len1);
return 0;
}