请教一个C程序,函数swap没有return返回值,为什么exchange还要调用呢?而且这个函数好像不太正确,求指教

输入三个数字,按大到小输出,要求要用指针和函数的调用
#include <stdio.h>
void main()
{
void exchange(int *q1,int *q2,int *q3);
int a,b,c,*p1,*p2,*p3;
scanf("%d%d%d",&a,&b,&c);
p1 = &a;
p2 = &b;
p3 = &c;
exchange(p1,p2,p3);
printf("%d %d %d \n",a,b,c);
}
void exchange(int *q1,int *q2,int *q3)
{
void swap(int *pt1,int *pt2);
if(*q1<*q2) swap(q1,q2);
if(*q2<*q3) swap(q1,q3);
if(*q2<*q3) swap(q2,q3);
}
void swap(int *pt1,int *pt2)
{
int temp;
temp = *pt1;
*pt1 = *pt2;
*pt2 = temp;
}
我输入“3,1,2” 时,输出结果却是“2,3,1” 奇怪?????
请各位能一一回答,详细一点,谢谢了哈!

if(*q1<*q2) swap(q1,q2);//因3>1,所以不换 *q1=3 *q2=1
if(*q2<*q3) swap(q1,q3);//因1<2,换 *q1=2 * q2=1 * q3=3
if(*q2<*q3) swap(q2,q3);//因1<3,换 *q1=2, *q2=3 *q3=1
所以输出为 2 3 1
要从大到小的话可以这么写
if(*q1<*q2) swap(q1,q2);//保证*q1>*q2
if(*q1<*q3)
{
swap(q1,q3);
swap(q1,q2);
}
if(*q2<*q3) swap(q2,q3);追问

它的值是怎么返回的啊,没有return语句喔??

追答

因为是按值传参,即传进来的是指向内存的指针,通过指针即可修改内存的值,不需要返回值。你去看看就懂了.

追问

一般比较三个数的大小,是不是只有这三个变量a,b,c 是不够的

追答

够啊?有什么问题?

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-05-01
指针变量和其他的变量不同,如果指针在子函数中的值变了的话,其在主函数中的值也会变
第2个回答  2012-05-01
在最后的if条件语句中有问题追问

我是郁闷它是怎么做到对调的,明明swap函数没有返回,执行了也木有用的啊??

c语言程序设计
这个说法是错误的,如果一个函数没有return语句,那就它不返回任何值,而不是返回一个不确定的值,并且该函数必须是一个void函数,不过一些老旧的编译器也可以允许不写void,还有,即使有return语句,也可以不返回任何值,仅仅是结束函数。不过对于main函数有个例外,就是如果main函数没有return语句,那么编...

c语言指针和函数的问题
在下面程序一中想利用swap函数交换主函数中两个指向a和b 的指针,但是这样是不能实现的,因为函数的形参不能改变实参,所以主函数中的那两个指针是没变的;但是程序二中sort函数中有跟程序一的swap函数类似的操作,可是在没有返回值的情况下主函数却得到了改变后的结果。为什么呢?请高人解释程序一swap(int *p1,int *...

C语言中的“void ”和“int”分别在什么时候使用?
当一个函数只需要别人调用,调用该函数的函数不需要得到返回值时用void,当需要从被调函数中返回一个int型数时就用int。\\x0d\\x0a比如比较大小的函数,\\x0d\\x0aint max(int a,int b){\\x0d\\x0areturn a>b?a:b;\\x0d\\x0a}\\x0d\\x0a调用该函数的函数需要知道哪个数大,就得返回...

c\/c++编程问题急求完整代码:编写swap交换函数
*b=t;}int main(int argv,char *argc[]){int x,y;printf("Input x & y(all int)...\\n");scanf("%d%d",&x,&y);printf("x = %d\\ty = %d\\n",x,y);swap(&x,&y);printf("After the exchange:\\n");printf("x = %d\\ty = %d\\n",...

C语言中函数调用,为什么交换了地址,可是所指的值还是不变那???
可是传回来的值没有改变,为什么呢!原因很简单.因为你的 int *t;int*t;t=a;a=b;b=t;交换的是 a和b 的地址.不要忘记了,当调用一个函数时.os会为 swap 函数中的 int *a,int *b.开辟内存.你改变的是swap开辟的内存.并没有改变 main中的*p和*q内存区域.我再说清楚点.p 保存的是 ...

c++函数模板问题: 有多个重载函数“swap”实例与参数列表相匹配!!!求...
&a, T &b)冲突了。你考虑换个名字?\/\/ TEMPLATE FUNCTION swap (from <algorithm>)template<class _Ty> inline void swap(_Ty& _Left, _Ty& _Right){\/\/ exchange values stored at _Left and _Right _Ty _Tmp = _Move(_Left);_Left = _Move(_Right);_Right = _Move(_Tmp);} ...

没有返回值的函数有什么用?
一个函数的函数名既是该函数的代表,也是一个变量。由于函数名变量通常用来把函数的处理结果数据带回给调用函数,即递归调用,所以一般把函数名变量称为返回值。函数式编程是种编程典范,它将电脑运算视为函数的计算。函数编程语言最重要的基础是 λ 演算(lambda calculus)。而且λ演算的函数可以接受函数...

c语言小程序问题:谁能告诉我为什么这个程序在输入1 3 2后还要输入\\n...
;return 0;} void exchange(int * p1,int * p2,int * p3){ void swap(int * p1,int * p2);if(*p1<*p2)swap(p1,p2);if(*p1<*p3)swap(p1,p3);if(*p2<*p3)swap(p2,p3);return;} void swap(int * p1,int * p2){ int temp;temp = *p2;p2 = *p1;p1 = temp;} ...

c++,swap函数,不需要头文件??
swap(_Ty& _Left, _Ty& _Right){ \/\/ exchange values stored at _Left and _Right _Ty _Tmp = _Move(_Left);_Left = _Move(_Right);_Right = _Move(_Tmp);} 忽略具体实现,注释中已经写明,这个swap函数来自algorithm,注意,这个algorithm和algorithm.h也是不一样的~请追问~~...

什么是函数返回值?
简单的说,函数就是一个算法,有不有返回值是跟这个函数做什么的有关系。一般情况下,求和这类的就要返回值,比如 int add(int a,int b){ return a+b;\/\/这就返回a+b的和,用函数的时候,你只要传a,b的值就得了 } 用的时候这样:int s=add(100,200); \/\/就把100+200也就是300的值赋...

相似回答