这是一道c语言的选择题中正确的一项,我计算觉得最后交换的是x和y当中的a与b的地址值,a和b中的值没有交换
#include<stdio.h>voidswap(int*p,int*q){intt;t=*p;*p=*q;*q=t;}main(){inta=10,b=20,*x=&...
#include<stdio.h>
void swap(int *p,int *q)
{ int t;
t=*p;*p=*q;*q=t;
}
main()
{ int a=10,b=20,*x=&a,*y=&b;
swap(x,y);
printf("%d %d\n",a,b);
}
经反复核对程序没有错,p、q指向x、y,x、y又指向a、b,我计算觉得最后交换的是x和y当中的a与b的地址值,a和b中的值没有交换,但因为是正确的选项,那应该是交换了,哪位高手能帮我详细分析出计算过程。
非常感谢你们的回答,但你们都没有明白我的问题出在哪,我的误区应该出在实参向形参的数据传递上,我原来的理解是x=*p,y=*q,p、q成为了x、y的指针变量,x、y又是a、b的指针变量,经过t=*p;*p=*q;*q=t;x与y中的存储的地址数值交换了,a、b的地址是固定的当然没有交换,而是变成x指向了b,y指向了a。我想不明白的应该是x、y的作用和x、y与p、q的关系。如果像其它三个选项没有x、y,就是a、b与*p、*q,还有t,我就不会想不通了。我仍然不理解x、y的是如何作用的,还请高手答疑解惑,非常感谢! 展开
void swap(int *p,int *q)
{ int t;
t=*p;*p=*q;*q=t;
}
main()
{ int a=10,b=20,*x=&a,*y=&b;
swap(x,y);
printf("%d %d\n",a,b);
}
经反复核对程序没有错,p、q指向x、y,x、y又指向a、b,我计算觉得最后交换的是x和y当中的a与b的地址值,a和b中的值没有交换,但因为是正确的选项,那应该是交换了,哪位高手能帮我详细分析出计算过程。
非常感谢你们的回答,但你们都没有明白我的问题出在哪,我的误区应该出在实参向形参的数据传递上,我原来的理解是x=*p,y=*q,p、q成为了x、y的指针变量,x、y又是a、b的指针变量,经过t=*p;*p=*q;*q=t;x与y中的存储的地址数值交换了,a、b的地址是固定的当然没有交换,而是变成x指向了b,y指向了a。我想不明白的应该是x、y的作用和x、y与p、q的关系。如果像其它三个选项没有x、y,就是a、b与*p、*q,还有t,我就不会想不通了。我仍然不理解x、y的是如何作用的,还请高手答疑解惑,非常感谢! 展开
4个回答
展开全部
楼主先纠正你逻辑上的错误,数值是存储在地址上的,我举个例子,现在两个杯子,一个杯子装水放在桌子上,一个杯子装果汁放在冰箱里。现在我把两个杯子位置交换了。那么请问放在桌子上的杯子装的是什么,冰箱的又是什么。
懂了吧,杯子就好比地址,杯子装的就好比数值。
还有一个大错误,就是计算机内存的地址是按编号排序的,有固定位置的,没有两个地址交换之说。
好了,现在我来给你解释下
t=*p;*p=*q;*q=t;的意思
首先t=*p,就是把地址*P中的值赋给t,*p=*q,就是把地址*q中的值赋给地址*p中的值,最后一句*q=t,就是把t的值赋给地址*q中的值。所以综上所述,这三句代码表达的意思就是把地址*q,*p中的值交换。
而最后输出的a,b就是把这两地址的值输出来,所以他们是交换了值而非地址。
懂了吧,杯子就好比地址,杯子装的就好比数值。
还有一个大错误,就是计算机内存的地址是按编号排序的,有固定位置的,没有两个地址交换之说。
好了,现在我来给你解释下
t=*p;*p=*q;*q=t;的意思
首先t=*p,就是把地址*P中的值赋给t,*p=*q,就是把地址*q中的值赋给地址*p中的值,最后一句*q=t,就是把t的值赋给地址*q中的值。所以综上所述,这三句代码表达的意思就是把地址*q,*p中的值交换。
而最后输出的a,b就是把这两地址的值输出来,所以他们是交换了值而非地址。
追问
你的解释很详细,我都明白,我的误区应该出在实参向形参的数据传递上,我原来的理解是x=*p,y=*q,p、q成为了x、y的指针变量,x、y又是a、b的指针变量,经过t=*p;*p=*q;*q=t;x与y中的存储的地址数值交换了,a、b的地址是固定的当然没有交换,而是变成x指向了b,y指向了a。我想不明白的应该是x、y的作用和x、y与p、q的关系。
展开全部
实际上你可以看做
int t;
t = a;
a = b;
b = t;//这样a和b的值就互换了
swap函数实现的就是这个,因为*p == a ,*q == b
地址指的是变量在内存空间中存放的编号,不能交换的
int t;
t = a;
a = b;
b = t;//这样a和b的值就互换了
swap函数实现的就是这个,因为*p == a ,*q == b
地址指的是变量在内存空间中存放的编号,不能交换的
追问
感谢你的回答,但你说的我都明白,我不明白的是x、y是怎样作用的。
追答
1、x,y分别指向了a,b,x,y内保存了a,b的地址,所以x,y可以操纵a,b
2、参数传递,swap传递的是x,y,也是就a,b的地址,也就是说,函数中的q,p也指向了a,b,可以操纵a,b
3,swap函数内,换的是a,b,不是q,p
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
int *x=&a; 表示x是int型的指针,指向a的地址,而函数
void swap(int *p,int *q)传入的是指针指向的数据。
swap(x,y);相当于swap(int *x,int *y);就把x指向的数据传进去了。
void swap(int *p,int *q)传入的是指针指向的数据。
swap(x,y);相当于swap(int *x,int *y);就把x指向的数据传进去了。
追问
你的意思是p、q并不是x、y的指针变量,不是我想的x=*p,y=*q,而是*x=*p,*y=*q,数据传递不涉及到*符号,对不对?
追答
对,p,q相当于x,y它们都是地址,然后通过*访问里面的数据,因为地址是固定的,改变里面的数据,该地址存储的数据改变了,但a,b地址没变,而输出a,b其实是输出刚开始分配存储a,b的地址里的数
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
a和b的地址是没有交换的,只是x和y的指向换了而已。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询