7个回答
展开全部
函数调用只是参数传递,在函数调用时,你可以认为会执行 a=x,b=y ,显然,a并不是x,b也不是y。。。你对变量a,b的任何操作都和x,y无关的,x,y只是给a,b附了初值仅此而已。。。。
如果想做到真正的交换,必须把地址传出去,而不是把值传出去,如果要传地址,参数必须是指针变量或引用变量,普通的变量不行。。。 比如swap(int *a,int *b),这是调用swap(&x,&y)就可以了,这时传的是地址。。。
引用方式为定义swap(int &a,int &b),调用swap(x,y)。。。。
如果想做到真正的交换,必须把地址传出去,而不是把值传出去,如果要传地址,参数必须是指针变量或引用变量,普通的变量不行。。。 比如swap(int *a,int *b),这是调用swap(&x,&y)就可以了,这时传的是地址。。。
引用方式为定义swap(int &a,int &b),调用swap(x,y)。。。。
展开全部
c中子函数,只要掌握几点,就不难了
1、声明
一般来说,先声明函数,在写代码,这个声明可以在main中,也可以在main的前面
但是也可以在main前面直接写子函数的代码,这样就不用在main中或者前面声明了
一般来说是三个情况
在main前面声明或在main中声明函数,在main函数的后面写完成功能代码
这里算是两种情况
还有一个是直接在main前面写功能代码,这样就不需要声明了
2、返回值
c是由众多的函数来构成的,每个函数都有返回值。main也有返回值,不过一般用户用不到
记住一点,任何函数的返回值有而且只能有一个返回值。无论是void型还是别的型。
3、参数问题
记住,除非用&来声明参数,否则实参和形成是在不同的内存空间中。
可以这么理解,形参是实参的一个影子。
调用函数是,会开辟新的内存来保存形参。也就是说,调用函数后,形参会另外开辟一个内存空间来保存参数。
那么效果就是,如果改变了形参内存中的内容,那么实参中的内容是不会改变的,因为他们不在一个内存空间中。
用指针是可以的,不过你要注意两点
一、改变指针是不可以的。在子函数中交换指针,那么和上面的效果是一样的,是参数交换,影响不到main中去。
二、需要交换指针指向的内存的数据才可以,也就是交换时需要带*,指向指针指向的内容。
这里特别指出的是,其实指针是没有改变的。你可以再main中和子函数中分别打印指针的内容(也就是一个地址)。这里main实现前,子函数是先前,子函数实现后,main实现后,都不会改变指针的内容。改变的只是指针指向的空间的内容。
理解就是,指针相当于门牌号,指向的内容就是住户。
也就是说门牌号从来都没有变
1、声明
一般来说,先声明函数,在写代码,这个声明可以在main中,也可以在main的前面
但是也可以在main前面直接写子函数的代码,这样就不用在main中或者前面声明了
一般来说是三个情况
在main前面声明或在main中声明函数,在main函数的后面写完成功能代码
这里算是两种情况
还有一个是直接在main前面写功能代码,这样就不需要声明了
2、返回值
c是由众多的函数来构成的,每个函数都有返回值。main也有返回值,不过一般用户用不到
记住一点,任何函数的返回值有而且只能有一个返回值。无论是void型还是别的型。
3、参数问题
记住,除非用&来声明参数,否则实参和形成是在不同的内存空间中。
可以这么理解,形参是实参的一个影子。
调用函数是,会开辟新的内存来保存形参。也就是说,调用函数后,形参会另外开辟一个内存空间来保存参数。
那么效果就是,如果改变了形参内存中的内容,那么实参中的内容是不会改变的,因为他们不在一个内存空间中。
用指针是可以的,不过你要注意两点
一、改变指针是不可以的。在子函数中交换指针,那么和上面的效果是一样的,是参数交换,影响不到main中去。
二、需要交换指针指向的内存的数据才可以,也就是交换时需要带*,指向指针指向的内容。
这里特别指出的是,其实指针是没有改变的。你可以再main中和子函数中分别打印指针的内容(也就是一个地址)。这里main实现前,子函数是先前,子函数实现后,main实现后,都不会改变指针的内容。改变的只是指针指向的空间的内容。
理解就是,指针相当于门牌号,指向的内容就是住户。
也就是说门牌号从来都没有变
追问
如果将形参的值传回实参,将形参改为地址就可以了吗?
追答
你说的是声明子函数的时候用&吧
这个是可以的啊
意思是说实参和形参同用一个内存地址。
void swap(int &a,int &b)
{
int t;
t=*a;
*a=*b;
*b=t;
}
main()
{
int x=2,y=4;
printf("x=%d,y=%d\n",x,y);
swap(&x,&y);
printf("x=%d,y=%d\n",x,y);
}
应该是这样吧,呵呵
这个我有点生疏,很少用。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这样写的swap函数,形参是值传递,则实参传入的时候,会复制一份实参,在函数里处理的是实参的副本,而不是实参,所以函数处理完后实参不会改变。采用swap(int &a, int &b)这样,引用传递,则不会复制实参,传入的是实参的引用,所以会改变实参。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
理论:形参相当于函数局部变量,不会对传入的‘值’产生影响。【C++中传‘引用’实质是传指针,传指针对‘指针的值’没有影响,但是对‘指向的值’有影响】。
修改,传指针
swap(int *a,int *b)
{
temp=*a;
*a=*b;
*b=temp
}
修改,传指针
swap(int *a,int *b)
{
temp=*a;
*a=*b;
*b=temp
}
追问
除了你说的传地址来解决数值交换之外,能不能再函数中增加一句return(a,b);来实现将形参的值传回实参呢?请问是否可行,谢谢
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
形参交换不改变实参的值,可以用地址传递 即将x,y的地址传给子函数,对地址内的内容进行交换即可
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询