指针混淆: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中的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中没有改变 但我也了解到,当指针和参数用作参数时,它们的值可能会发生变化,这与其他变量不同 我真想知道为什么第二种方法(注释部分

上面是代码

如果我把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是通过值传递的,但如果您将某个对象的地址作为值传递,则函数可以修改其范围之外的某个对象,因为您告诉了函数该变量的位置。