有返回值和无返回值之间的函数调用
C语言中创建及调用函数的简介
上期在说到Python实现阶乘相加时,对于函数的调用及递归没有进行详解,这次主要介绍清楚C语言中的函数调用。在C语言中,不管是对数值进行交换,或者是对数组进行排序,不考虑其时间复杂度,我们都喜欢创建一个调用函数来实现其功能。接下来,就一起进行了解吧!
首先,编写函数的一般形式为:
函数类型 函数名(参数类型 参数,...){函数体/代码块}
在进行函数调用时,必须在主调函数的函数体内首句对被调函数进行声明。其函数声明的一般形式为:
函数类型 函数名(参数类型 参数,...);
创建函数时与函数声明类似,把创建的函数的{}内容变成分号放在主调函数内即完成了对被调函数的声明。其中对于函数声明也有一些简化的写法,这里不进行讲解。
在知道了函数的编写及调用之后,我们来了解函数调用的特性,下面看一串代码:
#include<stdio.h>
#include<stdlib.h>
int main()
{
//编写调用函数,实现两个变量的值的交换
void max(int x,int y); //声明函数max
int a=3,b=5; //定义变量a,b
max(a,b); //调用函数max,将实参a,b传入max函数
printf("a=%d,b=%d\n",a,b); //输出a,b
system("pause");
return 0;
}
void max(int x,int y) //此时定义的是一个无返回值的max函数,函数主体内可无需return语句
//将实参a=3传给形参x,将实参b=5传给形参y
{
int temp;
temp=x;
x=y; //老三样,进行x,y之间的值互换
y=temp; //调用结束,回到main函数
}
在进行编译运行之后,运行结果为:a=3,b=5
在函数体内,已经完整的剖析了整串代码,那为什么进行的想x,y之间的值的互换,为什么a,b的值没有变换呢?
因为实参向形参的数据传递是“值传递”,单向传递,只能由实参传给形参,而不能由形参传给实参,实参与形参在内存中占有不同的存储单元,所以在调用无参函数时,进行普通的变量互换是无法传值回主调函数的。
而在定义有返回值的函数中,函数的返回值是通过函数的return语句获得的。return语句将被调函数中的一个确定值返回至main/主调函数中。
接下来再看一段代码:
#include<stdio.h>
#include<stdlib.h>
int main()
{
//编写调用函数,实现两个变量的值的交换
int max(int x,int y);
int a=3,b=5;
a=max(a,b);
b=3;
b=max(a,b);
printf("a=%d,b=%d",a,b);
system("pause");
return 0;
}
int max(int x,int y) //定义了一个返回值为int型的函数
{
int temp;
temp=x;
x=y;
y=temp;
return x; //返回给main函数的值为x的值
}
运行结果为:a=5,b=3
根据对上一个函数的详细过程同样分析这段代码,这里不再赘述,注意这里的b值并不是重新赋值后输出的3,而是进行函数调用而返回的3。
从这里我们可以看出可以通过定义有返回值的函数来进行获取值,但必须注意的是,一个return语句只能返回一个与其返回值类型相对应的值。这是它的局限性。
同时在定义函数时,必须对函数类型进行指定,如果无返回值类型必须写上void,如上:void max(参表列){}
有返回值必须写定返回值类型,返回值类型是由定义函数时指定的函数类型决定的,如上:
int max(参表列){
函数体
return int型的变量;
}
但其实我们学习了指针之后,我们可以通过指针来改变其值,看代码:
#include<stdio.h>
#include<stdlib.h>
int main()
{
//编写调用函数,实现两个变量的值的交换
void max(int *x,int *y);
int a=3,b=5;
max(&a,&b);
printf("a=%d,b=%d",a,b);
system("pause");
return 0;
}
void max(int *x,int *y)
{
int temp;
temp=*x;
*x=*y;
*y=temp;
}
输出结果为:a=5,b=3
指针的知识,到函数内容三时进行更新。
注意Python中的函数定义与C语言中是有区别的,简化了很多语法规则。读者注意区分,学完了C语言的语法规则后看Python中代码有帮助。
如觉得内容稍可,请留下你们的