函数-----自定义函数

前言:首先我们要知道在C语言中的函数与数学中的函数是云泥之别的,完全是两个不同的事物。

1 函数两种类型

1 库函数。首先我们知道,C语言中的函数其实是我们经常用的一系列代码封装后的形式。比如printf函数,当我们需要把想要的内容从我们的电脑的显示屏上打印出来,就会一直输入一段相同的代码,到后来我们把这一段代码放到一个函数库中去,在定义一个名字,当需要的时候就直接用这个名字就行了,在引用存放这一段代码的函数库就能完成显示在屏幕上的目的。即这就是我们所熟知的库函数。

2 自定义函数。当然库函数不可能把我们所需要的函数都完全定义,包含(不然的话,要我们程序员有啥用呢?谁便找一个人,了解一下使用的方法都可以编写代码)。此时就需要我们自己定义函数,来轻松地解决我们在程序编写过程中所遇到的问题。

2 函数的形式

函数的返回值类型/void  函数名(参数列表)

{

函数体

return 返回值;(注意当函数名前是void类型的时候没有返回值)

}

讲解:1 首先,当我们想要自定义一个函数的话首先要有一个名字,注意自己取的名字最最最好是具有  可读性。(可读性:就是看见这个名字,就可以猜到你所定义的函数的功能。打一个比方:加入一位姓王的人家,生了一个娃娃,取名叫王富贵。此时一听就能听出是男孩子,假如,取名叫做王美丽,自然而然的给人的第一印象是一个女孩。在比如,你想要定义一个把两个数A,B相加,函数名可以定义为ADD因为ADD在英语中就是相加的单词,当然,你也可以定义subtract(减法), 只要你知道就行了。两者孰高孰低,谁强谁弱,一目了然

函数名前的内容:当需要计算两个数之和时,就需要用到函数的返回值类型(此时一定不能用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;
}

结果:

传址调用显然达到了我们的要求了,所以在进行函数调用的时候,先想好是用传值调用还是传址调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值