我们都知道函数的实现,是需要参数传递来实现的。通常我们根据传递方式划分为两种:一种是传值方式,另一种是传地址的方式。
一、传值调用
1、区分实参和形参
调用函数的括号里面的参数是实际参数(实参);
被调用函数中的参数是形式参数(形参)。
2、传值调用:建立参数的一个副本并把值传递给形式参数,在被调用函数中修改形式参数的值,并不会影响到调用函数实际参数的值【实参】》》传递》》【形参】
3、栗子1:
#include <stdio.h>
int Add(int x,int y);//声明加法函数
void main()
{
int a,b,sum;
scanf("%d,%d",&a,&b);
sum=Add(a,b);//调用求和函数
printf("两数字之和:%d+%d=%d\n",a,b,sum);
}
int Add(int x,int y)//带形参的函数
{
return x+y;
}
栗子2:交换数字
#include <stdio.h>
void paixu(int x,int y);
void main()
{
int a,b;
printf("请你输入两个数:",&a,&b);
scanf("%d %d",&a,&b);
printf("a=%d,b=%d\n",a,b);
paixu(a,b);
printf("a=%d,b=%d\n",a,b);
}
void paixu(int x,int y)
{
int temp;
if(x>y)
{
temp=x;
x=y;
y=temp;
}
}
注意到了没有:上例中不管怎样输入大小数字,始终都没有排序,这是为什么呢?其实,在内存中,实际参数和形式参数分别占用不同的内存单元,形式参数只是实际参数的一个副本,一个复印件。实参和形参的值的改变,都不会相互影响。
上例中只是改变了形参x和y的值,并没有改变到实参a和b。因而并没有交换到数据。
二、传地址调用
在C语言中,可以通过指针(或地址)来实现传地址调用。下面先来个栗子进行分析:还是实现上面栗子2的。
#include <stdio.h>
void swap(int *x,int *y);
void main()
{
int a,b;
printf("请您输入两个整数:\n");
scanf("%d,%d",&a,&b);
if(a<b)
{
swap(&a,&b);
}
printf("两个整数%d和%d的较大者为:%d,较小者为:%d\n",a,b,a,b);
}
void swap(int *x,int *y)
{
int z;
z=*x;
*x=*y;
*y=z;
}
编译运行结果,实现了交换。从程序中看,调用swap(&a,&b)函数交换两个数,其中实参是变量的地址,就是把地址传递给被调用函数swap(int *x,int *y)中的形参。
而形参是指针变量,即是指针x和y指向变量a和b。这样交换*x和*y就是交换a和b。
【注】在传地址调用中,数组名也可以当做参数传递。在数组名作为参数传递时,传递的是整个数组。
数组名是数组的首地址,如果把数组名作为实际参数,在函数调用时,会把数组的首地址传递给形式参数。
形参可以根据数组的首地址访问整个数组并对其进行操作,因为整个数组的地址是连续的。
三、总结参数传值的那点事:
(1)在传值调用时,参数传递是单向传递,只能有实际参数传递给形式参数,而不能把形参反向传递给实参。(不能反向)只能实参→形参;
(2)在传地址调用时,对形参的操作就是对实际参数的操作,它们位于同一块内存单元。
❤永葆一颗纯洁、宽容平和、仁慈谦卑和意气风发的心!
态度决定一切 努力改变命运