c语言中指针作为实参使用SWAP函数的问题。

#include<stdio.h>voidswap(int*a,int*b){int*t;t=a;a=b;b=t;}main(){inti=3,j=5,*p=&i,*q=... #include<stdio.h>

void swap(int*a,int*b)
{
int*t;
t=a;a=b;b=t;
}
main()
{
int i=3,j=5,*p=&i,*q=&j;
swap(p,q);
printf("%d %d\n",*p,*q);
}
输出结果为什么是3 5,而不是交换后的5 3?
在swap函数中指针a、b的地址发生了互换,即指针p、q的地址也发生了互换,最后输出*p和*q应该分别是j和i(5 3)才对啊…
展开
 我来答
kaixingui2012
推荐于2017-10-15 · TA获得超过4.2万个赞
知道大有可为答主
回答量:1.4万
采纳率:81%
帮助的人:6339万
展开全部

c语言中形参与实参的关系是:形参是实参的值副本。无论参数的类型是什么,传递到子函数中的形参只是实参的值。所以,在改变形参变量自身的值时,是与实参无关的。换句话说,形参的改变不会影响到实参。

但,如果参数类型是指针类型,则可以通过对指针变量所指向的地址中的数据进行修改,达到改变实参地址中的数据目的。

因此,使用SWAP函数进行数据交换时,必须保证两点:

  1. 参数必须是指针类型,指向待交换的数据

  2. 交换时,必须交换地址中的数据,而不是交换地址本身。

参考代码:

//错误的交换代码1
void swap1( int a, int b ) //参数不是待交换数据的指针
{
    int t=a;
    a=b;
    b=t;
}
//错误的交换代码2
void swap2( int *a, int *b ) 
{
    int *t=a;//交换形参变量本身
    a=b;
    b=t;
}
//正确的交换代码
void swap( int *a, int *b ) 
{
    int t=*a;//交换形参变量地址中的数据,指针变量不变
    *a=*b;
    *b=t;
}
匿名用户
2012-09-17
展开全部
void swap(int*a,int*b)
{
int*t;
t=a;a=b;b=t; //这里交换的是指针a,b的副本,不影响指针指向的值
}
改为

void swap(int*a,int*b)
{
int t;
t=*a;*a=*b;*b=t; //这里交换的是值
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
feifly0918
推荐于2017-09-04 · TA获得超过318个赞
知道答主
回答量:186
采纳率:0%
帮助的人:158万
展开全部
你还没了解值传递和地址传递的本质啊。
首先 p ---> i q ----> j (p和q分别存放i和j的地址)你调用swap函数。
就会把实参的值复制一份给形参。也就是说a ----> i b ---->j。现在你在swap里面使用t指针交换了
a和b,也就是a ---> j b---->i,也就是说你交换的是指针的值!但是你想想主函数main当中p和q交换了吗??你只是复制了一份值给形参,自己本身没改变。你可以这样实验一下:
在swap函数中输出看一下:printf("a:%d\tb:%d\n",*a,*b); //你可以看一下结果是交换了的。不过随着swap函数的结束而释放了a,b的空间,然后回到main函数p和q的值还是原来的。
追问
你的意思是swap的形参a、b不能影响实参p、q的意思吗?
追答
你要抓住形参的值只是实参的一个副本,你改变其本身是不能实现交换的!

如果你是这样int t; t = *a; *a = *b; *b = t;你交换的就是地址所对应的值也就是i和j的值。
此时指针a和p指向的还是i的地址,只不过i地址里面存放的是j的值了。j同理!
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友2416aca46
2012-09-17 · TA获得超过1662个赞
知道小有建树答主
回答量:544
采纳率:0%
帮助的人:374万
展开全部
你的这个swap中指针参数 *a,*b 已经退化成普通的局部参数了,也就是说a和b同样也只是形参而已,只不过披了个指针的外衣,在函数体内交换的只是这两个指针本身的拷贝,而不是它们指向的内容,因此需要用解除指针的方式来交换它们指向的内容。其实这里提供指针做参数,只是为了让你有办法去访问它们的实际指向内容(实参),指针本身(形参)的交换没有任何意义。有两种改法:
1.
void swap(int *a, int *b)
{
int t = *a;
*a = *b;
*b = t;
}
2.
void swap(int &a,int &b)
{
int t = a;
a = b;
b = t;
}
swap(i,j);
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式