c语言中void函数的返回值,是怎么回事,例如下面这个函数

#include<stdio.h>
int main()
{
void swap(int *p,int *q);

int a,b,*m,*n;
a=2;
b=3;
m=&a;
n=&b;

swap(m,n);
printf("%d %d\n",a,b);
return 0;}

void swap(int *p,int *q)
{
int t;
t=*p;
*p=*q;
*q=t;
}

请问这个程序中的被调函数中参数的值是怎么传回主函数的。不是说void类型的函数没有返回值吗?而且值传递是单向的。。

void 代表空返回值。即无返回值
所给的案例中,swap函数是一个无返回值函数
但是该函数带两个输入参数
当主函数调用该函数时
只需要给定两个输入参数即可
该函数执行完毕后,无返回值
接下来继续往下执行,执行printf语句。追问

好古老的问题啊

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-03-13
返回类型定为void是指没有返回值。
函数返回有两种方式一种是通过返回值返回,一种是通过出参返回。
当一个参数是以指针地址形式传入函数的时候,就很有可能是出参。一个函数使用地址传入数据,他保证地址不变的情况下,改变地址所指向的值,这样就可以做到双向传输了。
就如void swap(int *p,int *q).函数传入了p和q两个地址,而函数内部对p和q的两个地址所指向的数值进行了交换,这样函数表面看起来没有返回值,其实他的两个形参所指向的数值变化了,也就是完成了函数功能了。追问

你的意思是不是说,值传递是单向的,而地址传递和引用传递是可以双向的?

追答

是的,值传递仅仅只能从函数外往里传,地址和引用传递都可以作为双向的。而且这在具体开发里面应用很普遍。

第2个回答  2013-03-13
被调函数根本就没有传参数回主函数。这里使用的是指针来改变变量的值。这里传的参数是指针,也就是变量的地址。在调用函数里面用地址改变了变量的值。可能你要对指针多一些理解追问

在被调函数中改变了地址中的值,但是主函数是怎么知道的,难道不需要告诉他什么他就可以直接判断地址中的值已经改变了吗 为什么你的回答和下面一位的回答不一样啊 感觉有点冲突,还是我理解错了,能不能去看下啊,我不知道听谁的?

追答

内存地址在程序运行的时候是一致的。你直接改,人家也是去拿那个地址的东西,拿到的当然是改过以后东西。我觉得没有冲突呀。都是指用指针改变变量的值,只是表达的方式不一样啊。可能你有一个矛盾就是别人说多返回值,而我说没有返回值。其实只是说法不一样而已。用指针修改变量的值,也就相当于是返回了值,所以很多地方都说多参返回。但是实际上是没有返回的。。这是概念问题。。把你弄糊涂了。

追问

你的意思是不是说,在被调函数中已经改变了内存中的内容,无论是被调函数还是主函数中的变量的值是直接从内存中拿的,所以因为在被调函数中已经改变了内存中的值,所以主函数从内存中拿到的值已经发生了变化(而所谓的值的返回也是从内存中把值调出来给相应的变量)

追答

变量不存在内存存哪。整个程序都是存在内存。。只要你用到这个变量就会从内存中把值调出来给变量,没有所谓的返回。都说了多参返回只是一个概念。意义上是这样。所以很多书上都讲多参返回。可以说那不是返回值,也可以说是。实际上函数有没有返回值是看你写的函数。你知道这个意思就行了,两种说法都是可以的,没必要限死。。要不然你学起来很痛苦的。。。值传递是复制值,主调函数把参数复制一份给被调函数,复制的是值,所以在被调函数里面修改不影响主调函数,因为是复制品。而传指针则是复制的地址,复制了一份变量的地址,地址都是指向那个变量,所以你改变那个地址指向的变量的值,当然在主调函数也会受到影响。当然,你可以在被调函数里面修改复制过来的地址,是不会影响到主调函数的。但是修改地址指向的值就不一样。C++的新功能就是引用传递,引用是一个变量的别名。实际上还是那个变量。只是用了另外一个名字。复制的也就是那个变量的名字,还是那个变量。只是用的不同的名字。还有我不明白你为什么说这里有
嵌套定义,这里只是函数的声明,后面有个分号,就算是声明变量一样声明函数,只是说后面有这个函数,并没有实现函数。因为在C语言中,前面定义的函数是不可以用到在后面定义的函数的。这里因为main()函数要用到swap()函数,所以必须在前面进行申明一下。。。。。。。。。。。

本回答被提问者采纳
第3个回答  2013-03-13
这里是指针传值,修改指针指向的数据,导致数据修改
----------------
但是这个程序有些问题
修改一下
#include<stdio.h>
void swap(int *p,int *q); //C、C++不支持函数嵌套定义

int main()
{
int a,b,*m,*n;
a=2;
b=3;
m=&a;
n=&b;
swap(m,n);
printf("%d %d\n",a,b);
return 0;
}
void swap(int *p,int *q)
{
int t;
t=*p;
*p=*q;
*q=t;
}追问

嵌套定义不可以吗?那为什么我在vc编译器上可以运行,而且上课老师也是这么讲的啊

追答

我也不明白C怎么回事了,反正最好不要嵌套定义,默认情况C/C++会出错的。。

相似回答