前言:首先我们要知道在C语言中的函数与数学中的函数是云泥之别的,完全是两个不同的事物。
1 函数两种类型
1 库函数。首先我们知道,C语言中的函数其实是我们经常用的一系列代码封装后的形式。比如printf函数,当我们需要把想要的内容从我们的电脑的显示屏上打印出来,就会一直输入一段相同的代码,到后来我们把这一段代码放到一个函数库中去,在定义一个名字,当需要的时候就直接用这个名字就行了,在引用存放这一段代码的函数库就能完成显示在屏幕上的目的。即这就是我们所熟知的库函数。
2 自定义函数。当然库函数不可能把我们所需要的函数都完全定义,包含(不然的话,要我们程序员有啥用呢?谁便找一个人,了解一下使用的方法都可以编写代码)。此时就需要我们自己定义函数,来轻松地解决我们在程序编写过程中所遇到的问题。
2 函数的形式
函数的返回值类型/void 函数名(参数列表)
{
函数体
return 返回值;(注意当函数名前是void类型的时候没有返回值)
}
讲解:1 首先,当我们想要自定义一个函数的话首先要有一个名字,注意自己取的名字最最最好是具有 可读性。(可读性:就是看见这个名字,就可以猜到你所定义的函数的功能。打一个比方:加入一位姓王的人家,生了一个娃娃,取名叫王富贵。此时一听就能听出是男孩子,假如,取名叫做王美丽,自然而然的给人的第一印象是一个女孩。在比如,你想要定义一个把两个数A,B相加,函数名可以定义为ADD因为ADD在英语中就是相加的单词,当然,你也可以定义subtract(减法), 只要你知道就行了。两者孰高孰低,谁强谁弱,一目了然)
2 函数名前的内容:当需要计算两个数之和时,就需要用到函数的返回值类型(此时一定不能用void)因为,我们需要得到两个数相加的结果,需要自定义的函数返回给main函数一个数。即有返回值。若使用 void,则是不需要返回给main函数一个结果,是只执行操作
3 参数列表 自定义函数中的我们称之为形参,形参的名字可以和实参相同,并且形参需要有类型名(比如:int char double float )
说一千道一万不如举例看一看
举例
#include<stdio.h>
int Add(int a,int b)//自定义一个把两个数相加的函数,并把结果返回到main函数之中
{
int ret=a+b;//函数体,其功能是把两个数相加
return ret;//返回两个数相加的结果
}
int main()
{
int a=0;//定义一个变量a
int b=0;//定义一个变量b
scanf("%d",&a,&b);//scanf是库函数,随意输入两个数
int c=Add(a,b);//通过使用自定义函数,把结果返回main函数后,并赋值给变量ret;
printf("%d\n",c);//打印结果
return 0;
}
1 在上面的部分说过:形参可以和实参的名字相同;实参:就是main函数中的向自定义函数中传递的数(在例子中是intc=Add(a,b) 此时的a,b就是实参)
2一般书上说的都是先声明,在定义函数。不过上面的例子中,没有声明,而是把自定义函数放在了main函数之前(我感觉也是可以的,毕竟从来没有报过错)
3 传值调用or传址调用
先解释:1 传址调用,是把Main函数中变量的地址当作实参传递给形参。
作用:可以通过自定义函数内部来改变自定义函数外部变量的值。
原因 因为形参是实参的一份临时拷贝(就是临时创建的,当有实参传参的时候,内存才会给自定义函数分配内存,当函数完成作用后会销毁,不占用内存)
4 看下面的例子
//写一个函数可以交换两个整型变量的内容
#include<stdio.h>
void swap(int x,int y)
{
int z=0;
z=x;
x=y;
y=z;
}
int main()
{
int a=0;
int b=0;
scanf("%d%d",&a,&b);
printf("交换前:a=%d b=%d\n",a,b);
swap(a,b);
printf("交换后:a=%d b=%d",a,b);
return 0;
}
//此函数是传值调用,其结果显然是不行的
可以看到使用传值调用的话,函数好像没有发挥作用
下面再来看一下传址调用的效果
//交换两个数,传址调用
#include<stdio.h>
void swap(int *x, int *y)//因为实参传递的是地址,所以接收的时候用的指针
{
int z = 0;
z = *x;
*x = *y;
*y = z;
}
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
printf("交换前:a=%d b=%d\n", a, b);
swap(&a,& b);//向形参传递的是a,b 的地址
printf("交换后:a=%d b=%d\n", a, b);
return 0;
}
结果:
传址调用显然达到了我们的要求了,所以在进行函数调用的时候,先想好是用传值调用还是传址调用