关于C语言编程的一点小问题。

Void swap(int *a,int*b)
{ int *t; t=a;a=b;b=t}
main()
{ int x=3,y=5,*p=&x,*q=&y;
swap(p,q)
printf("%d,%d",*p,*q);
}
这道题为什么输出的值是3和5?为什么不是5和3?
还有就是有void的函数不是五返回值吗,我在这道题里理解为他虽然执行了这个函数但是值不变可以不?到底是为什么?还有其他题虽然也是void但是也变了,这道题却没变,为什么?

我认为你的函数
Void swap(int *a,int*b)
{ int *t; t=a;a=b;b=t}
是个无用的函数,它不起任何作用;
原因如下:
a,b是两个swap函数内的局部变量,p,q是两个main函数内的变量,
调用swap(p,q)时将p,q 内存储的地址值赋值给了a,b;然后在swap函数内对a,b的存储的地址值进行了交换,不会影响p,q,也不会影响p,q所指向的单元x,y;
你要想交换x,y,则你的
Void swap(int *a,int*b)应该这样写
Void swap(int *a,int*b)
{
int tmp;
tmp=*a;
*a=*b;
*b=tmp;
}
这样才是对a,b 指向的单元进行交换,而不是交换a,b所存储的地址值;

调用时可以这样:swap(p,q);
也可以这样:swap(&a,&b);

建议好好研究一下,什么是指针,什么是指针变量,它们是不同的概念;
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-06-04
int *a, int *b,参数传递的应该是原指针的一个副本,虽然通过t使a、b指针互指对换,但不能改变main中的&x,&y;
------
建议通过改变指针的值达到交换数据的目的。
修改如下:
void swap(int *a, int *b)
{int t; t=*a; *a=*b; *b=t;}
第2个回答  2011-06-04
你没有弄明白指针和地址的关系,指针本身有个地址值,然后它也指向一个数据值,你的函数里面是指针的地址值交换,退出函数后对值的交换没有影响,指针对所指地址的值引用是:*temp;
函数改为:
void swap(int *a,int *b)
{int *t;*t = *a; *a=*b; *b = *t;}
就可以了……
第3个回答  2011-06-04
在swap中定义的中间变量应该为t,而不是*t
第4个回答  2011-06-04
注意到函数
void swap(int *a,int*b)
{ int *t; t=a;a=b;b=t;}
中, a,b,都是形参,也就是说a,b占用了新的内存,
调用 swap(p,q)时; 将p的内存值赋值给a,将q的内存值赋值给b,注意是赋值,p,q本身的内存与a,b的内存是不同的。
而函数内部的操作是,交换了形参a,b中的值,对与p,q来说没有丝毫改变,对与x,y来说也没有丝毫改变;
如果要改变的话,修改如下
void swap(int *a,int*b)
{ int *t; *t=*a;*a=*b;*b=*t;} //注意此时 a指向x, b指向y,调用结束后x=5,y=3
第5个回答  2011-06-04
void的函数就是没有返回值的函数,函数本身是没有值的,所以不存在只改不改变的问题
接下来说一下程序的问题:
在调用函数swap(p,q)的时候,会创建两个临时指针变量,不妨设为u,v
其中u=p即为x的地址,v=q即为y的地址
这个函数的功能是使u,v的值即指向地址改变,也就是u指向y,v指向x
函数结束后,临时变量收回,其他的什么事都没做,所以x还是原来的x,y的值还是原来的y
解决方法:
1,用传址方式传递参数
void swap(int & a,int &b)
{
int temp = a;a = b;b= temp;
}
2.在你这个程序的基础上改进,交换指针指向的实体
void swap(int * a,int * b)
{
int temp = *a;*a = *b;*b = temp;
}
相似回答