1.1定义:
在调用时有参函数时,主调函数和被调用函数之间有数据传递关系。在定义函数时函数名后面括号中的变量名称为“形式参数”(简称“形参”)或“虚拟参数”。在主调函数中调用一个函数时,函数名后面括号中的参数称为“实际参数”(简称为“实参”)。实际参数数可以是常量、变量或是表达式。
下面用代码进行分析:
#include
int test(int x) //形式参数,需要包含变量类型,
{ int y;
y=x+1;
return y;
}
int main()
{
int y,s;
puts("请输入一个数: ");
scanf("%d",&s);
y=test(s);//实际参数
printf("%d",y);
return 0;
}
上述代码中,根据上述定义: int test(int x):test是函数名,x是形参。y=test(s):s是实参。我是这样理解的。是因为输入一个数给了s,所以s变成实数,则是实参,由于x是处于接受值,所以没有固定的值,所以只是作为了形式参数
1.2数据传递:
在调用函数过程中,系统会把实参的值传递给被调用函数的形参。或者说,形参从实参得到的一个值。该值在函数调用期间有效,可以参加该函数中的运算。
在调用函数过程中发生的实参与形参间的数据传递称为“虚实结合”。
下面用代码进行分析:
比较两个数的大小
#include
int main()
{
int max(int x,int y); //对main函数的声明
int a,b,c;
printf("please enter two integer numbers:");//提示输入数据
scanf("%d,%d",&a,&b);
c=max(a,b); //调用max函数,有两个实参,大数赋给c
printf("max is %d\n",c); //输出大数c
return 0;
}
int max(int x,int y) //定义max函数,有两个参数
{
int z; //定义临时变量z
z=x>y?x:y; //把x和y中的大着赋给z
return (z); //把z作为max函数的值带回卖弄函数
}
程序分析:
主函数中包含了一个函数调用max(a,b)。max后面括号内的a和b是实参。
a和b是在main函数中定义的变量,x和y是函数max的形式参数。通过函数调用,在两个函数之间发生数据传递,实参a和b的值传递给形参x和y,在max函数中把x和y中的最大者赋给变量z,z的值作为函数值返回main函数,赋给 变量C。
2.1函数调用时变量地址的变化
1.首先说明:同一变量在被调用函数中的地址与在main函数中的地址是不一样。下面用实例证明:
两个数进行交换
#include
void data_ShuJu(int data0,int data1) //开始声明函数,在main函数就可以不用声明
{
int t; //定义变量t,用于交换数据
t=data0;
data0=data1;
data1=t;
}
int main()
{
int a=10;
int b=20;
printf("交换前的数据:%d %d\n",a,b);
data_ShuJu(a,b);
printf("交换后的数据:%d %d\n",a,b);
return 0;
}
运行结果:
交换前的数据:10 20
交换后的数据:10 20
在这就会发现a和b的值没有发生改变,
主要是存储数据的地址或内存空间没有发生改变,由于值是与地址或内存空间对应的,所以a和b的值未发生改变。这其实是值得思考的问题,那如果让a和b的值发生改变我们将该怎么做呢?
由于指针是发生地址改变的,那接下用指针可以解决掉这个问题,下面用代码进行证明,还是上述例子。
#include
void data_ZhiJin(int *data0,int *data1) //开始声明函数,在main函数就可以不用声明
{
int t; //定义变量t,用于交换数据
t=*data0;
*data0=*data1;
*data1=t;
}
int main()
{
int a=10;
int b=20;
printf("交换前的数据:%d %d\n",a,b);
data_ZhiJin(&a,&b);
printf("交换后的数据:%d %d\n",a,b);
return 0;
}
运行结果:
交换前的数据:10 20
交换后的数据:20 10
大家可以进行实践,自已可以体会一下语言的妙处啊!