函数参数中指针传参和引用传参的区别

引用符号&和指针*都可以在函数参数中出现,但使用上是有区别的。首先这两种用法如果在函数中对传入的参数有所改变,那么这种改变是会一直保留的,不会在函数作用域外就恢复。当然,也有很多时候我们不希望传入的参数被人为的改变,这时候可以使用const关键字,关于const和引用符号&的搭配,防止传入参数被改变的情况可以参考这篇文章https://blog.csdn.net/weixin_41232202/article/details/94090353?spm=1001.2014.3001.5501

虽然引用和指针的方式作为传参方式都会保留该函数对传入参数的改变,但这两种方法还是有区别的。这个区别表现在,引用的方式下可以直接使用该参数,而指针的方式通常都需要解引用,或者直接看成一个指针。具体表现如下:

void printVector(vector& a)
{
    for(int i=0; i* a)
// 这里a是指针名,a指向的内容*a,才是原来的vector a 
{
    int temp = (*a)[0];
    (*a)[0] = (*a)[a->size()-1];
    (*a)[a->size()-1] = temp;
}

void test1()
{
    vector a;
    a.insert(a.end(), 1);
    a.insert(a.end(), 2);
    a.insert(a.end(), 3);
    
    printVector(a);
    swapFirstandLast(&a);
    printVector(a);
}

上面的代码中,分别定义了两个函数,传入相同的参数,vector类型的变量a。一个使用引用传递,一个使用指针传递。

可以看到,调用printVector函数时,参数位置直接写a就可以。但是在调用swapFirstandLast函数时,参数位置需要传入a的地址,这里&是取地址符。

而在被调用的函数内部,用到了vector类型的size函数。在引用传递的情况下,可以直接使用a.size()。而在指针传递时,就需要使用a->size(),或者(*a).size()。即指针传入时,要么使用解引用,要么就直接看成指针,使用->来调用内部的函数。

这里有一个误区,当我们传入的参数是一个数组时,是一种特殊情况。因为数组名同时可以作为指针,所以传入时可以不用使用取地址符&,在取数组中的某个数时,也可以不用解引用。具体如下:

void printVectorB(int b[], int n)
{
    for(int i=0; i

你可能感兴趣的:(C++,c++)