函数(子程序),由于库函数有限,所以需要大量自定义函数。
自定义函数组成:
ret_type fun_name(para)
{
statement;//语句项,整个大括号包括内容为函数体。
}
//ret_type 返回类型
//fun_name 函数名
//para 函数参数(形式参数)
例子1,写一个函数可以找出两个整数中的最大值。
#include <stdio.h>
int get_max(int x, int y)//形式参数(形参)x,y,只有函数被调用过程中才会实例化(分配内存单元),函数调用完成后自动销毁。(临时拷贝)
//函数形参和实参命名可以相同
{
int z;
if (x = y)
z = x;
if (x < y)
z = y;
return z;//返回较大值z
}
int main()
{
int a = 10;
int b = 20;
int max = get_max(a, b);//调用函数,返回值进入z中
//使用传值调用
//实际参数(实参)a,b,可以为常量,变量,表达式,函数等,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参
printf("%d\n", max);
return 0;
}
例子2,写一个函数,交换两个整型变量的值。
错误示例:
#include <stdio.h>
void swap(int x, int y)
{
int z = x;
x = y;
y = z;
}
int main()
{
int a = 10;
int b = 20;
swap(a, b);
printf("%d %d\n", a, b);
打印结果:
原因:swap(a,b)采用传值调用。实参a,b传送给函数后,函数创建了名为x,y的临时内存块(形参),用于分别存放a,b,函数的形参(x,y)和实参(a,b)分别占有不同的内存块,对形参修改不会改变实参。
正确示例:
#include <stdio.h>
void swap(int* pa, int* pb)//整型指针变量,pa,pb用于存放传入的地址(a,b的地址)
{
int z = *pa;//*pa解释:通过pa里面存放的地址(变量a的地址),找到它所指向的对象(a),即*pa=a
*pa = *pb;
*pb = z;
}
int main()
{
int a = 10;
int b = 20;
swap(&a, &b);//采用传址调用,将函数外部创建的变量的内存地址传递给函数参数,这种传参方式可以让函数与函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量
printf("a=%d b=%d\n", a, b);
}
打印结果: