值传递和地址传递的区别是,值传递只有形参发生改变,实参没变。址传递实参变了
实参(实际参数):给出参数具体的数据,会被函数内部的代码使用,所以称为实际参数,简称实参。
形参(形式参数):没有数据,只能等到函数被调用时接收传递进来的数据,所以称为形式参数,简称形参。
传递(参数):函数被调用时,实参的数据赋给形参的过程,执行函数的具体功能,现以交换a=3,b=8这两个数值的程序为例。
//关于值传递和地址传递的学习,以交换函数为例
#include<stdio.h>
void swap1(int x, int y);
void swap2(int *m, int *n);
int main()
{
int a = 3, b = 8;
printf("调用函数前:实参a=%d 实参b=%d\n\n", a, b);
swap1(a, b);
printf("值传递调用函数后:实参a=%d 实参b=%d\n\n", a, b);
swap2(&a, &b);
printf("址传递调用函数后:实参a=%d 实参b=%d\n", a, b);
return 0;
}
void swap1(int x, int y)
{
int temp;
temp = x;
x = y;
y = temp;
printf("值传递调用函数中:形参x=%d 形参y=%d\n", x, y);
}
void swap2(int *m, int *n)
{
int temp=*m;
*m = *n;
*n = temp;
printf("址传递调用函数中:形参m=%d 形参n=%d\n", *m, *n);
}
得出的结果如下
由此可见值传递只有形参发生改变,实参并没有改变。址传递中实参形参都发生了改变。
究其原因,是值传递实参形参在不同内存中,传递是单向的,即实参只能传递给形参,而形参传不回来给实参了。
而地址传递实参把变量的地址给了形参,实参和形参在同一内存中。