概念
在定义函数时函数括号中的变量名成为形式参数,简称形参或虚拟参数;
在主调函数中调用一个函数时,该函数括号中的参数名称为实际参数,简称实参,实参可以是常量、变量或表达式。
注意:
- C语言中实参和形参之间的数据传递是单向的值传递。
- 被调用函数的形参只有函数被调用时才会临时分配存储单元,一旦调用结束占用的内存便会被释放。
- 值传递中包括值传递和指针传递(地址值),传递的都是实参的一个拷贝。
void exchange(int x, int y)
{
printf("x:%d,y:%d
", x, y);
printf("&x:%x,&y:%x
", &x, &y);
printf("------------
");
int temp = x;
x = y;
y = temp;
printf("x:%d,y:%d
", x, y);
printf("&x:%x,&y:%x
", &x, &y);
}
void exchange1(int* x, int *y)
{
printf("*px:%d,*py:%d
", *x, *y);
printf("px:%x,py:%x
", x, y);
printf("&px:%x,&py:%x
", &x, &y);
printf("------------
");
int temp = *x;
*x = *y;
*y = temp;
printf("*x:%d,*y:%d
", *x, *y);
printf("x:%x,y:%x
", x, y);
printf("&x:%x,&y:%x
", &x, &y);
}
void exchange2(int &x, int &y)
{
printf("x:%d,y:%d
", x, y);
printf("&x:%x,&y:%x
", &x, &y);
printf("------------
");
int temp = x;
x = y;
y = temp;
printf("x:%d,y:%d
", x, y);
printf("&x:%x,&y:%x
", &x, &y);
}
int main()
{
int x, y;
x = 3;
y = 5;
printf("x:%d,y:%d
", x, y);
printf("&x:%x,&y:%x
", &x, &y);
printf("------------
");
printf("值传递
");
exchange(x, y);
printf("实参
");
printf("x:%d,y:%d
", x, y);
printf("&x:%x,&y:%x
", &x, &y);
printf("指针传递
");
int *px, *py;
px = &x;
py = &y;
exchange1(px,py);
printf("实参
");
printf("*x:%d,*y:%d
", *px, *py);
printf("x:%x,y:%x
", px, py);
printf("&x:%x,&y:%x
", &px, &px);
printf("引用传递
");
exchange2(x, y);
printf("实参
");
printf("x:%d,y:%d
", x, y);
printf("&x:%x,&y:%x
", &x, &y);
cin.get();
}
值传递
传递的参数是实参的副本主调函数向调用函数传递参数实际上只是将实参的拷贝(即临时副本)传递给了被调用函数,并不是实参本身,这样被调函数不能直接修改主调函数中变量的值,而只能修改其私有的临时副本的值。
x:3,y:5
&x:cff89c,&y:cff890
------------
值传递
x:3,y:5
&x:cff7a0,&y:cff7a4
------------
x:5,y:3
&x:cff7a0,&y:cff7a4
实参
x:3,y:5
&x:cff89c,&y:cff890
x:3,y:5
&x:cff89c,&y:cff890
------------
指针传递
*px:3,*py:5
px:cff89c,py:cff890
&px:cff7a0,&py:cff7a4
------------
*x:5,*y:3
x:cff89c,y:cff890
&x:cff7a0,&y:cff7a4
实参
*x:5,*y:3
x:cff89c,y:cff890
&x:cff884,&y:cff884
引用传递
对引用的操作等于对其指定的对象进行操作,当将实参传递给形参时,形参就指向了实参(形参与实参同义,是它的一个别名)
引用传递过程中,被调函数的形式参数虽然同样作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。
引用传递
x:5,y:3
&x:cff89c,&y:cff890
------------
x:3,y:5
&x:cff89c,&y:cff890
实参
x:3,y:5
&x:cff89c,&y:cff890