解答:
1. 注意形式参数和实际参数的区别,主函数中的x,y是实际参数,swap函数中的a,b是形式参数。他们各有自己的存储空间,互不干扰。
2. 在程序适当位置加上输出地址的语句,即可看出为什么回到主程序后,x,y的值为什么不交换。
为了更形象,可以用图表示它们的关系:
可见,交换的只是swap函数中的a,b值,对主函数中的a,b值没有影响。
3. 修改的方法,将swap的交换变成值的交换。
int swap(int *a,int *b)//a与b分别复制主函数x与y的值,即a与x的指向相同,b与y的指向相同
{
int *t;
{t=a;a=b;b=t;}//通过交换,a和y的指向相同,b与x的指向相同,但是,x与y没有改变原来指向,这样函数swap结束,a与b消失,输出结果不变
}
换成
int t;
{t=*a;*a=*b;*b=t;}//将改变x和y指向的地址的值,达到交换目的
//分析如下:
x=&a;y=&b; //指针x指向变量a,指针y指向变量b
swap(x,y); //调用swap函数,实参x赋值给形参a, 实参y赋值给形参b,进入swap函数体
//在swap函数体中
int swap(int *a,int *b)
{
int *t;
{t=a;a=b;b=t;}
}
//在swap函数体中,指针a指向main()函数的变量a, 指针b指向main()函数的变量b,
//特别注意,实参x此时仍然指向变量a,实参y仍然指向变量b。
//指针x,y和变量a,b存放在main()函数的栈区中,而指针a,b是在swap()函数的栈区中,
//执行{t=a;a=b;b=t;}后,指针a指向了main()的变量b了,指针b指向了main()函数的变量a了。
//这个指针交换语句,它只是改变了指针本身的值,也就是改变了指针的指向,而没有改变指针
//所指向的内存空间的内容。当swap()函数执行完后,swap的栈区空间也就释放了,那么栈区里
//的局部变量指针a,b,t的内存空间也就都不存在了。返回到main()函数继续执行,此时main()函数
//里的指针x,y仍然是x—>a,y—>b,所以执行printf("%d %d\n",*x,*y);语句,所以输出的仍然还是
//a,b的值,没有交换a,b的值。出现这种输出结果的原因就是形参值的改变(也就是swap()函数的指针变量a,b)
//并不会影响实参x,y的值。虽然你传进去的是指针变量,是地址值,但是你没有改变指针指向的变量
//的值,而只是改变了局部指针变量本身的值,这跟值传递就没什么区别了。因此,swap函数需要做如下修改:
void swap(int *a, int *b)
{
int t;
{t=*a; *a=*b; *b=t;} //这样做就改变了局部指针变量指向的变量的值,亦即交换两个变量的值
}
swap只是把指针地址给交换了,但是虚参是不能改变实参的,看起来是把地址交换了,但实际上等同于没换
所以,并没有改变指针地址里存的内容
#include//这是用函数调用的方法,为什么这个方法为什么就不能实现。
void swap(int *a,int *b)
{
int t;
{t = *a;
*a = *b;
*b = t;}
}
void main()
{
int a,b,*x,*y;
scanf("%d %d",&a,&b);
x=&a;y=&b;
swap(x,y);
printf("%d %d\n", *x, *y);
}
#include
main()
{
int swap(int* a, int* b);
int a, b, *x, *y;
scanf("%d %d", &a, &b);
x = &a;
y = &b;
swap(x, y);
printf("%d %d\n", *x, *y);
}
int swap(int* a, int* b)
{
int t;
{
t = *a;
*a = *b;
*b = t;
}
}