值传递:
形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,
不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。
指针传递:
形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作
指针传递的实质:
指针传递参数本质上是值传递的方式,它所传递的是一个地址值。值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,
即在栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的
任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。(这里是在说实参指针本身的地址值不会变)
#include <stdio.h>
void swap(int p1,int p2)
{
int temp;
temp = p1;
p1 = p2;
p2 = temp;
}
int main()
{
int a;
int b;
printf("输入两个数字:\n");
scanf("%d%d",&a,&b);
swap(a,b);
printf("a=%d,b=%d\n",a,b);
return 0;
}
运行结果:
结果显示 a和b的值没有交换,这就是值传递
值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。
(这里是在说实参指针本身的地址值不会变)
修改后:
#include <stdio.h>
void swap(int *p1,int *p2) //pi和p2改成了指针变量
{
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
int main()
{
int a;
int b;
printf("输入两个数字:\n");
scanf("%d%d",&a,&b);
swap(&a,&b); //将a和b的地址传递给函数
printf("a=%d,b=%d\n",a,b);
return 0;
}
运行结果:
<img src="https://img-blog.csdn.net/20161104164021340" alt="" />