#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类型的函数没有返回值吗?而且值传递是单向的。。
好古老的问题啊
你的意思是不是说,值传递是单向的,而地址传递和引用传递是可以双向的?
追答是的,值传递仅仅只能从函数外往里传,地址和引用传递都可以作为双向的。而且这在具体开发里面应用很普遍。
在被调函数中改变了地址中的值,但是主函数是怎么知道的,难道不需要告诉他什么他就可以直接判断地址中的值已经改变了吗 为什么你的回答和下面一位的回答不一样啊 感觉有点冲突,还是我理解错了,能不能去看下啊,我不知道听谁的?
追答内存地址在程序运行的时候是一致的。你直接改,人家也是去拿那个地址的东西,拿到的当然是改过以后东西。我觉得没有冲突呀。都是指用指针改变变量的值,只是表达的方式不一样啊。可能你有一个矛盾就是别人说多返回值,而我说没有返回值。其实只是说法不一样而已。用指针修改变量的值,也就相当于是返回了值,所以很多地方都说多参返回。但是实际上是没有返回的。。这是概念问题。。把你弄糊涂了。
追问你的意思是不是说,在被调函数中已经改变了内存中的内容,无论是被调函数还是主函数中的变量的值是直接从内存中拿的,所以因为在被调函数中已经改变了内存中的值,所以主函数从内存中拿到的值已经发生了变化(而所谓的值的返回也是从内存中把值调出来给相应的变量)
追答变量不存在内存存哪。整个程序都是存在内存。。只要你用到这个变量就会从内存中把值调出来给变量,没有所谓的返回。都说了多参返回只是一个概念。意义上是这样。所以很多书上都讲多参返回。可以说那不是返回值,也可以说是。实际上函数有没有返回值是看你写的函数。你知道这个意思就行了,两种说法都是可以的,没必要限死。。要不然你学起来很痛苦的。。。值传递是复制值,主调函数把参数复制一份给被调函数,复制的是值,所以在被调函数里面修改不影响主调函数,因为是复制品。而传指针则是复制的地址,复制了一份变量的地址,地址都是指向那个变量,所以你改变那个地址指向的变量的值,当然在主调函数也会受到影响。当然,你可以在被调函数里面修改复制过来的地址,是不会影响到主调函数的。但是修改地址指向的值就不一样。C++的新功能就是引用传递,引用是一个变量的别名。实际上还是那个变量。只是用了另外一个名字。复制的也就是那个变量的名字,还是那个变量。只是用的不同的名字。还有我不明白你为什么说这里有
嵌套定义,这里只是函数的声明,后面有个分号,就算是声明变量一样声明函数,只是说后面有这个函数,并没有实现函数。因为在C语言中,前面定义的函数是不可以用到在后面定义的函数的。这里因为main()函数要用到swap()函数,所以必须在前面进行申明一下。。。。。。。。。。。
嵌套定义不可以吗?那为什么我在vc编译器上可以运行,而且上课老师也是这么讲的啊
追答我也不明白C怎么回事了,反正最好不要嵌套定义,默认情况C/C++会出错的。。