参数中的值传递和地址传递

函数参数中的值传递:

void my_swap(int m,int n)

{
    int tmp = 0;
    
    tmp = m;m = n;n = tmp;

    printf("m = %d,n = %d\n",m,n) ;   
    
}

int main()

{
    int a = 11,b = 22;

    my_swap(a,b);

   printf("a = %d,b = %d\n",a,b);        
}

在这段代码中,我想实现的效果是交换a和b的值,即, a = 22,b = 11 ,但是打印结果是 m = 22,n = 11    a = 11,b = 22 ,这是因为在 my_swap() 中参数是以值传递的方式传入的,也就是说, my_swap(a,b); 代表的只是将a的值复制给m,将b的值复制给n,并没有告诉函数变量a和b的地址,所以实际上该函数并没有对变量a和b进行任何操作。

但是如果将函数的参数改为 my_swap(int *m,int *n) ,因为形参是指针所以实参也要相应的进行变换 my_swap(&a,&b); 这样一来函数内部实现就应该变成对指针的操作:

void my_swap(int *m ,int *n)

{
     int tmp = 0;

     tmp = *m;//将m指向的变量的值赋值给tmp

     *m = *n;//将n指向的变量的值给了m指向的变量

     *n = tmp;//将tmp的值给了n指向的变量

}   

这时指针m持有变量a的地址,指针n持有变量b的地址,在函数内部通过指针对变量a和b的值进行了交换,最终打印出来的结果是 a = 22,b = 11 (交换了a和b的值)。

猜你喜欢

转载自www.cnblogs.com/haystack/p/12652478.html