为什么还是没交换,能解释下原理吗,知道函数内的值是复制一份得到的,但还是不理解。
#include <stdio.h>
void swap(int a,int b);
int main()
{
int a=5;
int b=6;
swap(a,b);
printf("%d-%d\n",a,b);
return 0;
}
void swap(int a,int b)
{
int t;
t=a;
a=b;
b=t;
}
在这个代码中,你试图在swap
函数中交换a
和b
的值。然而,当你调用swap(a,b)
时,实际上是将a
和b
的值复制到了swap
函数的形参a
和b
中,而不是直接对a
和b
进行交换。
在C语言中,函数的参数传递方式是按值传递,这意味着函数接收的是实参的副本,而不是实参本身。因此,当你在swap
函数中修改a
和b
的值时,只是修改了函数内部的副本,而不会影响到主函数中的a
和b
。
要实现交换效果,可以使用指针作为参数,通过操作指针指向的地址来实现对变量的修改。下面是修改后的示例代码:
#include <stdio.h>
void swap(int *a, int *b);
int main()
{
int a = 5;
int b = 6;
swap(&a, &b);
printf("%d-%d\n", a, b);
return 0;
}
void swap(int *a, int *b)
{
int t;
t = *a;
*a = *b;
*b = t;
}
在修改后的代码中,swap
函数接收的是指向a
和b
的指针,通过对指针进行解引用操作*
,可以获取指针指向地址的值,并对其进行修改,从而达到交换变量的效果。在主函数中调用swap(&a, &b)
时,将a
和b
的地址作为实参传递给了swap
函数。
通过这种方式,就可以在函数中修改变量的值,并且这个修改会影响到主函数中的变量。
希望这个解释可以帮助你理解为什么在你的代码中交换没有生效,并且给出了一个正确交换变量值的示例代码。如果你还有其他疑问,请随时提问。
因为函数内的a和b,与main里的a和b虽然变量名一样,但实际分配的内存空间不同。所以你交换函数内a和b变量的值,和main里的a和b变量一毛钱关系也没有
打个比方,你对某个人进行了克隆,产生了一个新的人,那么当新的人中奖1000万时,跟原来那个人是毫无关系的,因为是两个不同的人,虽然是克隆技术产生的
=========
如果参数改成指针类型,那么实际上相当于传递了一个身份证,这个身份证是唯一的,所以两个函数中的变量实际是同一个人
void 函数里是不能传参数的,你把里面参数删掉,把main里的也删掉
在函数内部交换变量的值时,可能会遇到交换没有生效的情况。这是因为函数参数的传递方式会影响到变量值的操作。
函数参数的传递方式通常有值传递和引用传递两种方式。在值传递方式下,函数会将参数的值复制一份传递给函数内部,而不是传递参数本身的引用。因此,对参数值的修改不会影响到原始变量。
举例说明:
void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
}
int main() {
int x = 1;
int y = 2;
swap(x, y);
printf("x = %d, y = %d", x, y);
return 0;
}
输出结果为 "x = 1, y = 2",说明在函数内部交换操作没有生效。
为了解决这个问题,可以使用引用传递的方式将参数的引用传递给函数。引用传递可以修改参数的值,并且可以在函数内部对传入的变量进行修改。
举例说明:
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int x = 1;
int y = 2;
swap(&x, &y);
printf("x = %d, y = %d", x, y);
return 0;
}
输出结果为 "x = 2, y = 1",说明在函数内部交换操作生效了。
在这个例子中,我们使用了指针作为函数的参数,并将变量的地址传递给函数。在函数内部,通过指针可以修改变量的值,从而实现了交换操作。
因此,在函数中交换两个变量的值时,需要根据参数的传递方式来选择合适的方式。如果需要修改原始变量的值,可以使用引用传递方式(指针或引用),如果不需要修改原始变量的值,可以使用值传递方式。
如果你还有其他关于函数参数传递方式的疑问,可以继续提问。
swap函数里面用int*接受,在调用的时候应该传&a,&b
主函数里定义的 int a , b; ,它的作用域就在主函数体内部,主函数结束后,它的生命期也随之结束。
void swap(int a,int b) 函数里的形参 int a, b; 及 int t;,它们的作用域在swap()函数体内,虽然与主函数里的变量同名,但互不干涉,是代表不同的变量,所以在函数里交换 a b 的值,作用仅局限在swap()函数体里, 待swap()函数运行结束,它们生命期也随之结束,对主函数里的变量不会有作用。