c++在参数中的引用传递

系作者原创,转载请注明地址:https://blog.csdn.net/coder_what/article/details/83997016


背景:在学严蔚敏的数据结构c语言版的时候,里面有关函数形参传递的时候出现了c++中的(&x),觉得甚是方便,故来学习记录

熟悉c语言的师傅们都知道指针可以改变函数调用过程的形参。

而函数参数的传递方式有3种:值传递,地址传递,引用传递

对于地址传递来说,先放上两个代码大家比较一下:

void swap_c(int *a,int *b)
{
    int *temp=a;
    a=b;
    b=temp;
    return;
}
void swap_c(int *a,int *b)
{
    int temp= *a;
    *a=*b;
    *b=temp;
    return;
}

显而易见,这个函数的目的是互换实参的大小,但是 

如果用main函数调用的话,大家会发现,同样是传递的地址,第一个函数并不能改变大小,而第二个函数才能改变,why??

先不说为什么,我先放上一个值传递的代码:

void swap_c(int a,int b)
{
    int temp=a;
    a=b;
    b=temp;
    return;
}

定睛一看,这个函数为什么和第一个所谓的“地址传递”函数的机制那么像呢? 

其实,这两个都不能改变实参的大小。错误的地方也一模一样。他们都仅仅是把形参或者形参的地址传递给了形参,之后函数就再与实参没有任何关系了。因此并不能改变原来实参的数值。

而对于第二个函数,地址传过去以后,在函数中通过*又重新令地址指向数值,在函数中完成了对实参的改变,是真正的地址传递。

对于引用传递来说,函数定义格式和值传递差不多,只不过参数多加了一个取地址符。这样的话c++就会自动令函数中当形参改变时,就会改变实参。

我举个显而易见的栗子:

#include
void swap(int,int);
void swap_c_plus(int &,int &);
void swap_c(int *,int *);
int main()
{
    int a,b;
    scanf("%d%d",&a,&b);
    printf("原来 : a=%d,b=%d\n",a,b);
    swap(a,b);
    printf("值传递: a=%d,b=%d\n",a,b);
    swap_c_plus(a,b);
    printf("引用传递: a=%d,b=%d\n",a,b);
    swap_c(&a,&b);
    printf("地址传递: a=%d,b=%d",a,b);
    getchar();
    getchar();
}
void swap(int a,int b)
{
    int temp=a;
    a=b;
    b=temp;
    return;
}
void swap_c_plus(int &a,int &b)
{
    int temp=a;
    a=b;
    b=temp;
    return;
}
void swap_c(int *a,int *b)
{
    int temp=*a;
    *a=*b;
    *b=temp;
    return;
}

 

你可能感兴趣的:(c++在参数中的引用传递)