本次将通过两个实例来学习函数。
1.传值函数
要求:写一个比较两个整型大小的函数
实例
int get_max(int x, int y)
{
if (x > y)
return x;
else
return y;
}
int main()
{
int a, b = 0;
scanf("%d%d", &a, &b);
int max = get_max(a, b);
printf("最大值为%d", max);
return 0;
}
首先介绍一下函数执行顺序:
函数是一个独立的代码块,在主函数内调用时以语句形式执行,(可进入函数代码块进行监视,通过型参和实参的储存地址及储存内容的不同加深理解),该代码块只在主函数调用时执行。
型参:型参在内存的储存地址为独立生成的,与实参无关,而且是临时的,执行完该函数后型参便会销毁。
实参:可以是常量、变量、表达式、函数等,无论实参是何种类型的数据,在进行函数调用时,实参必须有确定的值,以便把这些值传送给形参,所以应该提前用赋值、输入等办法使实参获得确定值。
实参传递给型参值的过程仅仅是将实参的值传递给型参的过程,因为型参是确定的值,所以在内存中有相应的地址储存该值,本质上说就是型参地址里存储的内容转移到实参地址内,函数代码块随后通过该内容执行下一步,然后将型参的存储地址及内容销毁等待下一次调用。
在实例中,我们设置了一个get_max的函数,其结构为
函数名:get_max(实参1,实参2),该函数会返回一个最大值,所以我们在主函数外声明该get_max函数。
当调用该函数时,(型参1,型参2)的储存地址内会接收到实参传递的数值,随后对两个参数内储存的值进行比较,型参1的值>型参2的值时,返回型参1的值,反之则返回2的值。返回的值与实参的值类型保持一致,故设定为int型。
设置一个整型的max变量接收该返回值(即最大值)并打印。程序结束。
整个过程中,实参和型参只传递了值,故为传值函数。
2.传址函数
要求:写一个可以交换两变量值的函数。
实例
void exc(int* pa, int* pb)
{
int tem = 0;
tem = *pa;
*pa = *pb;
*pb = tem;
}
int main()
{
int a, b;
printf("请输入a,b\n");
scanf("%d%d", &a, &b);
printf("a = %d,b = %d\n", a, b);
int* pa = &a;
int* pb = &b;//创建指针
exc(&a, &b);
printf("a = %d,b = %d\n", a, b);
return 0;
}
思路:我们设置一个exc(a,b)的函数,不需要返回值,当输入实参1,实参2的变量名后,其值会互换。
这里如果我们直接操作型参的话,a->型参1,b->型参2,随后设置一个中间变量tem,代码如下:
void exc(int x, int y)
{
int tem;
tem = x;
x = y;
y = tem;
}
最终,执行完该函数后,x,y都会销毁,a和b存储的值完全没变。
所以我们考虑用指针变量,将型参1,型参2直接指向实参1,实参2的储存地址,让函数直接通过地址修改实参1和实参2里面的值。
其步骤如下:
1)创建储存实参值的a,b的指针变量pa,pb;