C语言中关于void的问题。

例8.3调用swap函数,交换主函数中变量x和y中的数据。#include"stdio.h"voidswap(int*,int*);main(){intx=10,y=20... 例8.3 调用swap函数,交换主函数中变量x和y中的数据。
#include"stdio.h"

void swap(int *,int *);

main()
{int x=10,y=20;
printf("(1)x=%d y=%d\n",x,y);
swap(&x,&y);
printf("(4)x=%d y=%d\n",x,y);
}
void swap(int *a,int *b)
{int t;
printf("(2)a=%d b=%d\n",*a,*b);
t=*a; *a=*b; *b=t;
printf("(3)a=%d b=%d\n",*a,*b);
}
问大家如下几个问题:
1.这里的void swap(int *,int *);
和void swap(int *a,int *b)
中的void 分别是什么含义?
2. “void 是无返回值类型”吗?若是,这个例题是否有“返回值”?若有,返回值是什么?若没有,说明原因,毕竟这个程序已经通过传送地址的方式在“被调用函数”中直接改变“调用函数”中的变量的值了。
3.在swap(&x,&y);
printf("(4)x=%d y=%d\n",x,y);
}
中,是否可以理解为“被调用”函数的计算结果的值返回到swap(&x,&y);
中,而通过printf("(4)x=%d y=%d\n",x,y);打印出x=20 y=10 呢?
毕竟原来“没有”调用之前是 (1)x=10 y=20 的。
这里的“返回值”为“被调用函数”执行后得出的结果,即 X=20,Y=10的值,有2个返回值。是否可以这样理解呢?
展开
 我来答
finalken
2011-07-29 · TA获得超过211个赞
知道小有建树答主
回答量:229
采纳率:0%
帮助的人:105万
展开全部
1.这里的void swap(int *,int *);
和void swap(int *a,int *b)
中的void 分别是什么含义?
void 写在函数前面,说明没有返回值。

函数返回值是通过return 语句返回的,而swap没有返回值。你的意思是被调函数对主函数中的值进行了操作,其实这个是因为你传入给被调函数的参数其实是两个内存地址,&a,&b的意思是取两者的内存地址。
函数中的*a和*b指取两者所指向的内存,被调函数直接改变了内存里的数据,所以主函数中变量的值改变了(变量的值是保存在内存中的)。
追问
这里的“返回值”为“被调用函数”执行后得出的结果,即 X=20,Y=10的值,有2个返回值。是否可以这样理解呢?
追答
返回值至多只能有一个,如下面的add函数返回值是sum
int add(int a,int b)
{
int sum = a + b;
return sum;
}
void main()
{
int res;
int x = 5, y = 8;
res = sum (x, y);
}
如果你需要多个值在函数运算以后被改变,那么就需要传指针。就是你上面写的方式。传指针可以在函数内部修改指针所指内存的数据,在函数返回后,这些数据仍然被修改了。在C语言中,这个不叫返回值。
ba5ham
2011-07-29 · TA获得超过8834个赞
知道大有可为答主
回答量:2673
采纳率:0%
帮助的人:2510万
展开全部
void swap(int *, int *); 说明 swap 函数没有返回值, 尽管 swap 函数通过指针变量的方式可以将结果传递给调用程序,但因为 swap 函数没有显示的 retuen x 的语句,所以调用 swap() 的语句只能写成:

int a=1, b=2, x;
swap(&a, &b);

而不能写成
x = swap(&a, &b);
追问
这里的“返回值”为“被调用函数”执行后得出的结果,即 X=20,Y=10的值,有2个返回值。是否可以这样理解呢?
追答
不是这样的,带返回值的函数中 必须有 return 语句将结果返回给调用函数。其特征是函数返回值可以直接赋值给变量或参与运算。如函数 int add(a,b); 将 a, b 相加:

int (int a, int b)
{
return a+b;
}

其它函数调用 add 函数:
int x, a=1. b=3;
x = add(a+b);

而 void 类型的函数是不能这样赋值的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zero_fn
2011-07-29 · TA获得超过2258个赞
知道小有建树答主
回答量:1173
采纳率:80%
帮助的人:444万
展开全部
1、void 不是五返回值类型,而是“无类型”,即不是任何已经定义过的类型。再直白的说就是没有,在函数名前面的意思就是不返回任何类型的数据
2、函数改变的不是参数本身,输入参数是指针,参与运算的实际数据不是作为参数的指针,而是通过指针间接访问的内存单元。就像中国移动通过银行拿了你的钱,但没拿银行的钱(虽然其实他很想直接拿银行的钱)
3、还是那句,作为参数的数据地址没有变,只是地址里的数据变了,
“是否可以理解为“被调用”函数的计算结果的值返回到swap(&x,&y);”不要这么牵强的去理解改变了的东西。就像银行从不在乎中国移动要扣你多少钱,银行只在乎你是否同意扣钱
追问
这里的“返回值”为“被调用函数”执行后得出的结果,即 X=20,Y=10的值,有2个返回值。是否可以这样理解呢?
追答
返回值应该是程序主动,有目的地传回主调函数的值,不是说在被调用函数内被改变的值都是返回值,不要这样牵强的去理解。
再具体一点,(一般)一个函数在被调用的时候参数是通过寄存器传入,而不是某个内存地址的数据传入被调用函数,被调用函数执行完成后,有需要的话需要将计算结果放入寄存器作为“返回值”传回给主调函数。如果某个值(非内部临时变量)在被调函数内部被修改,这些值不应该被理解为返回值,而仅仅是程序执行的结果而已。只有在被调函数结束放到特定寄存器里并由主调函数使用的才叫返回值。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zhoulianxue
2011-07-29
知道答主
回答量:48
采纳率:0%
帮助的人:30.9万
展开全部
第一个问题,两个void是一样的,都是定义函数,第一个也可以写void swap(int *a,int *b);
如果第一个不写,函数
void swap(int *a,int *b)
{int t;
printf("(2)a=%d b=%d\n",*a,*b);
t=*a; *a=*b; *b=t;
printf("(3)a=%d b=%d\n",*a,*b);
}
写在main前面就可以了
第二个问题的回答,void无返回值。该函数为何改变了变量,因为该函数的参数是指针,指针指向的是变量的地址,于是对于该地址的操作等同于对于原变量的操作,于是变量的值会改变
第三个问题是错误的问题,swap函数并没用返回变量的值,该问题在第二个回答已给出答案
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式