1.参数 ①实际参数(实参):真实传给函数的参数,叫实参。实参可以是常量,变量,表达式,函数等,在进行函数调用是,他们必须具有确定的值,以便将这些值传给形参。 ②形式参数(形参):形参值函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才会被实例化(分配内存单元),所以叫形式参数。形式参数在函数调用完后就自动销毁,因此形式参数只在函数中有效。 形参实例化后其实相当于实参的一份临时拷贝。 2.函数调用 ①传值调用 函数的形参和实参分别占用不同的内存块,对形参修改不会影响实参。 eg:
//判断一个数是否为素数
int is_prime(int n)
{
int i = 0;
for (i = 2; i <= sqrt(n); i++)
{
if (n%i == 0)
return 0;
}
return 1;
}
int main()
{
int a = 0;
printf("请输入>:");
scanf("%d", &a);
if (is_prime(a) == 1)
{
printf("是素数。\n");
}
else
{
printf("不是素数。\n");
}
return 0;
}
②传址调用 传址调用是值把函数外部创建变量的内存地址传给函数参数的一种函数调用方式,这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以操作函数外部的变量。 eg:
//交换两个数的函数
void Swap(int* x, int* y)
{
int temp = *x;
*x = *y;
*y = temp;
}
int main()
{
int a = 10;
int b = 20;
Swap(&a, &b);
printf("%d %d", a, b);
return 0;
}
3.函数声明和定义 函数声明: ①告诉编译器有一个函数叫什么,参数是什么,返回类型是什么,但是具体是否存在无关紧要。 ②函数的声明一般出现在函数使用之前,要满足先声明后使用。 ③函数声明一般放在有头文件中。 函数定义: 函数的定义是指函数的具体实现,交待函数的功能实现。 4.函数递归 程序调用自身的编程技巧称为递归。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂问题转化成一个与原问题相似的规模较小的问题来求解,递归程序只需要少量程序就可以描述解题过程中所需的多次重复计算,大大减少程序代码量,递归主要思想在于:把大事化小。 递归的两个必要条件: ①存在限制的条件,当满足这个限制条件时,递归将不再继续。 ②每次调用后会越来越接近这个限制条件。 递归常见错误:栈溢出(Stack Overflow) eg:
//求n的阶乘
int factorial(int n)
{
if (n <= 1)
return 1;
else
return n * factorial(n - 1);
}
//编写函数,不允许创建临时变量,求字符串长度
int my_strlen(char* str)
{
if (*str != '\0')
return 1 + my_strlen(str + 1);
else
return 0;
}
//接受一个整型值(无符号),按顺序打印每一位
void print(int n)
{
if (n > 9)
{
print(n / 10);
}
printf("%d ", n%10);
}