高手求教,为什么swap函数没能交换两指针变量本身的地址。。

luoyou1992 2016-11-08 03:23:09
#include <stdio.h>
void swap(int *p1,int *p2){
int *p;
p=p1,p1=p2,p2=p;
}
void main(){
int a,b;
int *t1=&a,*t2=&b;
printf("请输入a和b的值\n");
scanf("%d,%d",&a,&b);
if(a<b){
swap(t1,t2);
}
printf("a=%d,b=%d\n",a,b);
printf("max=%d,min=%d",*t1,*t2);
}
比如输入1,3,
结果是a=1,b=3
max=1,min=3
为什么会这样啊。。
...全文
761 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_45376832 2019-07-09
  • 打赏
  • 举报
回复
swap()函数用void空类型,并不会改变*p1和*p2的值啊,这两个值只会在函数内改变,并不会把主程序中的*p1和*p2改掉,而且函数内的变量用完就自动删掉了,并没有什么用。你可以把*p1和*p2改为全局变量,这样就可以在执行函数的时候改动变量的值了。注意swap括号里的东西要删掉。
636f6c696e 2019-07-09
  • 打赏
  • 举报
回复
void swap(int *p1,int *p2){
int p;
p=*p1,*p1=*p2,*p2=p;
}
AlbertS 2016-11-08
  • 打赏
  • 举报
回复
你传地址应该改内容啊 改成这样试试

#include <stdio.h>
void swap(int *p1,int *p2){
int p;
p=*p1,*p1=*p2,*p2=p;
}
void main(){
int a,b;
int *t1=&a,*t2=&b;
printf("请输入a和b的值\n");
scanf("%d,%d",&a,&b);
if(a<b){
swap(t1,t2);
}
printf("a=%d,b=%d\n",a,b);
printf("max=%d,min=%d",*t1,*t2);
}
赵4老师 2016-11-08
  • 打赏
  • 举报
回复
仅供参考:
#include <stdio.h>
#define SWAP(a,b) do ((&(a))!=(&(b)))?((a)^=(b)^=(a)^=(b)):((a)=(a)); while (0)
char   *p1="1" ,*p2="2" ;
char    c1=1   , c2=2   ;
short   s1=1   , s2=2   ;
int     i1=1   , i2=2   ;
__int64 I1=1i64, I2=2i64;
float   f1=1.0f, f2=2.0f;
double  d1=1.0 , d2=2.0 ;
void main() {
    SWAP((int)p1,(int)p2);                printf("char *     %5s,   %5s\n",p1,p2);
    SWAP(c1,c2);                          printf("char       %5d,   %5d\n",c1,c2);
    SWAP(s1,s2);                          printf("short      %5d,   %5d\n",s1,s2);
    SWAP(i1,i2);                          printf("int        %5d,   %5d\n",i1,i2);
    SWAP(I1,I2);                          printf("__int64 %5I64d,%5I64d\n",I1,I2);
    SWAP(*(int     *)&f1,*(int     *)&f2);printf("float      %5g,   %5g\n",f1,f2);
    SWAP(*(__int64 *)&d1,*(__int64 *)&d2);printf("double    %5lg,  %5lg\n",d1,d2);

    SWAP(c1,c1);
    printf("%d\n",c1);
}
//char *         2,       1
//char           2,       1
//short          2,       1
//int            2,       1
//__int64     2,    1
//float          2,       1
//double        2,      1
//2
liqunhua4413 2016-11-08
  • 打赏
  • 举报
回复
例3: #include <stdio.h> void change(int *, int *); int main (void) { int x = 3, y = 5; change(&x,&y); printf("x = %d, y = %d",x, y); return 0; } void change(int * a, int * b) { int t; t = *a; *a = *b; *b = t; } 结果:x = 5, y = 3 分析:交换成功!把地址传过去,直接改地址里的值。
liqunhua4413 2016-11-08
  • 打赏
  • 举报
回复 3
#include <stdio.h> void change(int *, int *); int main (void) { int x = 3, y = 5; change(&x,&y); printf("x = %d, y = %d",x, y); return 0; } void change(int * a, int * b) { printf("a = %d, b = %d\n",*a, *b); int * t; t = a; a = b; b = t; printf("a = %d, b = %d\n",*a, *b); } 结果: a = 3, b = 5 a = 5, b = 3 x = 3, y = 5 分析:没有交换!把地址传过去,但是是把地址传给了新定义的两个指针变量,然后两个指针变量的值的给交换啦,所以两个新定义的指针变量所指向的对象交换啦,但是原先的两个整型变量值并没有改! 易错点:C语言中实参变量和形参变量之间的数据传递是单向的“值传递”方式。不能通过执行调用函数(change)来改变实参指针变量(&x,&y)的值,但是可以改变实参指针变量所指变量的值。

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧