指针混淆:c中的swap方法 #包括 无效交换(int*a,int*b){ int p=*b; *b=*a; *a=p; /*int*p=b; b=a; a=p; */ } int main(){ INTA,b; scanf(“%d%d”、&a和&b); 互换(a&b); printf(“%d%d”,a,b); }
上面是代码 如果我把35作为输入,那么它应该交换它的值,53应该作为输出。 我通过尝试int p=*b得到了答案 然而,我也尝试了评论部分,但它不起作用 所以,我在交换区和主区查看了他们的地址 在交换int*a和int*b时,它们的地址发生了变化 然而,当我回到main时,a和b的地址并没有改变 首先我想:是不是因为参数int*a,int*b是局部变量,所以它在main中没有改变 但我也了解到,当指针和参数用作参数时,它们的值可能会发生变化,这与其他变量不同指针混淆:c中的swap方法 #包括 无效交换(int*a,int*b){ int p=*b; *b=*a; *a=p; /*int*p=b; b=a; a=p; */ } int main(){ INTA,b; scanf(“%d%d”、&a和&b); 互换(a&b); printf(“%d%d”,a,b); },c,pointers,pass-by-reference,swap,function-definition,C,Pointers,Pass By Reference,Swap,Function Definition,上面是代码 如果我把35作为输入,那么它应该交换它的值,53应该作为输出。 我通过尝试int p=*b得到了答案 然而,我也尝试了评论部分,但它不起作用 所以,我在交换区和主区查看了他们的地址 在交换int*a和int*b时,它们的地址发生了变化 然而,当我回到main时,a和b的地址并没有改变 首先我想:是不是因为参数int*a,int*b是局部变量,所以它在main中没有改变 但我也了解到,当指针和参数用作参数时,它们的值可能会发生变化,这与其他变量不同 我真想知道为什么第二种方法(注释部分
我真想知道为什么第二种方法(注释部分)没有交换值…在第二种方法中,您使用的局部变量限制在函数
swap
的范围内。因此,主函数中的变量a
或b
与定义为swap
函数中的参数的变量a
或b
不同
使用指针时,swap
函数将更改指针指向的值(这意味着该函数将更改main
函数中声明的a
和b
地址处的值)。假设您的意思是
#include<stdio.h>
void swap(int *a,int *b){
int p=*b;
*b=*a;
*a=p;
/*int *p=b;
b=a;
a=p;
*/
}
int main(){
int a,b;
scanf("%d %d",&a,&b);
swap(&a,&b);
printf("%d %d",a,b);
}
该代码只是交换swap()
函数中指针的值。这不会在main()
中交换地址,因为正如您所说,“参数int*a,int*b是局部变量”
当您像这样调用函数swap()
时
void swap(int *a,int *b){
int *p=b;
b=a;
a=p;
}
a
和b
的地址在swap()函数中被传递并成为局部变量。您不能更改a
或b
的地址-它们在内存中有一个位置
在有效的代码中
swap(&a,&b);
你不会改变指针的值,你会改变指针指向的内存中的值,这就是为什么这样做的原因
当C是按值传递时,如果您将某个变量的地址作为值传递,则函数可以修改其范围之外的某个变量,因为您告诉了函数该变量的位置。在C中,函数中声明的所有变量都是该特定函数的局部变量。
所以,你在函数交换中写了一些东西
int*p=b
上面的代码将把b的值复制到p中。因此,当函数交换返回时,它的局部变量p、b和a将消失。如果要更改函数中的原始对象,必须通过引用将它们传递给函数
在C语言中,通过引用传递对象意味着通过指向原始对象的指针间接传递对象
否则,如果将原始对象本身传递给函数,函数将处理对象的副本。很明显,更改副本不会影响原始对象
这正是在这个函数中发生的事情
void swap(int *a,int *b){
int p=*b;
*b=*a;
*a=p;
}
函数处理在此调用中作为参数传递给函数的指针副本
void swap(int *a,int *b){
int *p=b;
b=a;
a=p;
}
这就是函数确实交换了声明为其参数的两个指针的值。但它们不是传递给函数的原始指针。它们是指针的副本。所以原始指针的值没有改变
函数交换通常可以按以下方式进行
swap(&a,&b);
其中T
是相同的类型说明符
因此,如果要交换类型为int
的对象,则在上述函数中,T
将是int
,函数如下所示
void swap( T *a, T *b )
{
T tmp = *a;
*a = *b;
*b = tmp;
}
void swap( int *a, int *b )
{
int tmp = *a;
*a = *b;
*b = tmp;
}
如果要交换int*
类型指针的值,则T
将是int*
,函数如下所示
void swap( T *a, T *b )
{
T tmp = *a;
*a = *b;
*b = tmp;
}
void swap( int *a, int *b )
{
int tmp = *a;
*a = *b;
*b = tmp;
}
这是一个演示程序
void swap( int **a, int **b )
{
int *tmp = *a;
*a = *b;
*b = tmp;
}
也就是说,首先在程序中,类型为int
的两个对象被交换,因此想象中的类型说明符T
是int
然后交换指向对象a
和b
的两个指针。因此,想象中的类型说明符T
int*
交换指针后,指针pa
现在指向对象b
,指针pb
现在指向对象a
,感谢您的精彩解释。因为我不是以英语为母语的人,所以我没能听懂最后一句话。如果您能用更简单的话解释一下,我将不胜感激:虽然C是通过值传递的,但如果您将某个对象的地址作为值传递,则函数可以修改其范围之外的某个对象,因为您告诉了函数该变量的位置。