C语言用指针法交换两个数的顺序问题

交换两个数的顺序,可以交换地址,可以交换值。当用函数调用法交换地址的时候,为什么不可以实现。程序如下:
#include<stdio.h>//这是用一个主函数就交换的方法。
main()
{
int a,b,*x,*y,*t;
scanf("%d %d",&a,&b);
x=&a;y=&b;
{t=x;x=y;y=t;}
printf("%d %d\n",*x,*y);
}

#include<stdio.h>//这是用函数调用的方法,为什么这个方法为什么就不能实现。
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;}
}

解答:

1.    注意形式参数和实际参数的区别,主函数中的x,y是实际参数,swap函数中的a,b是形式参数。他们各有自己的存储空间,互不干扰。

2.    在程序适当位置加上输出地址的语句,即可看出为什么回到主程序后,x,y的值为什么不交换。

为了更形象,可以用图表示它们的关系:

可见,交换的只是swap函数中的a,b值,对主函数中的a,b值没有影响。

3.    修改的方法,将swap的交换变成值的交换。

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-11-24
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指向的地址的值,达到交换目的本回答被提问者采纳
第2个回答  2019-01-16
//分析如下:
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;}  //这样做就改变了局部指针变量指向的变量的值,亦即交换两个变量的值
}

第3个回答  2019-01-15

swap只是把指针地址给交换了,但是虚参是不能改变实参的,看起来是把地址交换了,但实际上等同于没换

所以,并没有改变指针地址里存的内容

#include<stdio.h>//这是用函数调用的方法,为什么这个方法为什么就不能实现。
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);
}

第4个回答  2019-01-15
#include <stdio.h>
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;
    }
}

相似回答