第
函数探秘:深入理解C语言函数,实现高效模块化编程
4.函数的参数
在函数使?的过程中,把函数的参数分为,实际参数和形式参数。下面我仍将以加法函数举例:
#includestdio.h
intAdd(intx,inty)
//函数名Add
//两个形式参数x,y,类型都是int
//返回类型也是int
intc=0;
c=x+y;
returnc;//返回x+y的和
intmain()
inta,b;
scanf(%d%d,a,
intret=Add(a,b);//加法函数
printf(两个数和为%d\n,ret);
return0;
4.1实际参数
顾名思义,实际参数就是实际存在的参数,也就是主函数main调用函数时传给它的参数,也就是上面主函数中的a,b。
4.2形式参数
同理,形式参数其实就是形式上的参数,也就是上面加法函数Add中的x,y。它并不是实际存在的,在未使用时并不会向内存申请空间,形式参数只有在函数被调?的过程中为了存放实参传递过来的值,才向内存申请空间,这个过程就是形式的实例化。
4.3实参与形参的关系
在介绍实参和形参关系时,我们先看看下面这段代码
#includestdio.h
voidswap(intx,inty)//返回类型为void表示不返回值
inttemp=0;//定义一个临时变量
temp=x;//把x的值赋给temp
x=y;//把y的值赋给x
y=temp;//把temp的值赋给y,完成交换操作
intmain()
inta=0;
intb=0;
scanf(%d%d,a,
printf(交换前:a=%d,b=%d\n,a,b);
swap(a,b);//交换函数
printf(交换后:a=%d,b=%d\n,a,b);
return0;
那么交换后的输出是多少呢~
为什么交换的值还是不变呢,我们可以通过调试来观察一下
通过调试,我们发现a与x,b与y只是在数值上相同,他们地址是完全不同的,他们在两个独立的内存空间互不影响,对x,y交换根本不会改变a,b的值。并且函数在调用完成之后,函数所申请的内存空间会归还系统~
所以我们总结实参与形参的关系是:形参只是实参的?份临时拷?,对形参改变根本不会影响实参
4.4数组做参数
我们前面学过的数组自然是也能作为函数的参数来使用,下面是一个具体实例:
voidprint_arr(intarr[],intsz)//打印数组
inti=0;
for(i=0;ii++)
printf(%d,arr[i]);
printf(\n
其中arr是整个数组,sz是数组元素的个数
5.嵌套调用和链式访问
5.1函数的嵌套调用
我们在前面已经学习了选择结构和循环结构的嵌套使用,那函数嵌套调用又是怎样的呢。其实,简单来说,就是函数中也可以调用函数
举个例子,让我们看看下面这段代码
voidprint2()
printf(helloworld\n
voidprint1()
print2();//调用print2函数
intmain()
print1();//调用print1函数
return0;
C语言函数支持嵌套调用,但是不支持嵌套定义。
5.2函数的链式访问
链式访问简单来说就是将?个函数的返回值作为另外?个函数的参数,像链条?样将函数串起来就是函数的链式访问。
举例:
这是strlen的函数声明:size_tstrlen(constchar*str)
#includestdio.h
intmain()
printf(%d\n,strlen(abcdef));
//根据strlen的返回值,我们就可以直接将其作为printf的参数
//这就是一种简单的链式访问
return0;
6.函数的定义与声明
6.1函数的定义
函数的定义就是指函数具体的实现过程,交代函数具体功能的实现
比如我们前面写的加法函数具体实现的过程就是函数的定义
intAdd(inta,intb)
returna+b;//直接返回
但是特别注意函数不能嵌套定义
inta