引用和指针

- 引用变量的创建

在C语言中&表示取地址符号,而在C++中&多了一种不一样的功能,即用来声明一个变量是另外一个变量的别名,例如:

int a;
int & b=a;//b是a的别名

其中&不是地址运算符,而是类型标识符的一部分,是b是a的别名,所谓别名,大家可以把它看做是一个人的小名,比如说一个人叫张三小名叫狗蛋,张三是这个人,狗蛋也是这个人。引用也是这个意思。
举一个程序的例子可以看的更加清晰

#include<iostream>
using namespace std;
int main()
{
    int a = 100;
    int & b = a;//b是a的别名
    cout << " a= " << a  ;
    cout << " b= " << b << endl;
    a++;
    cout << " a= " << a ;
    cout << " b= " << b << endl;
    //打印a和b的地址
    cout << " a address = " << &a <<endl;
    cout << " b address = " << &b << endl;
    system("pause");
    return 0;
}

注意下述语句的&不是地址运算符而是将b的类型声明为int &,即指向int变量的引用

int &b =a;

但下述语句中的&是地址运算符,其中&a是a变量的地址

cout << " a address = " << &a <<endl;
    cout << " b address = " << &b << endl;

程序的输出结果如下图所示
这里写图片描述
从中可知a变量的地址和b变量的地址相同,给a++会同时影响两个变量的值。

- 引用和指针的关系

对我们来说引用和指针很像,但是引用和指针还是有着不小的区别,例如我们同时创建一个指向a的指针和引用:

int a=100;
int &b=a;
int *p=&a;

这样a和b还有*p都可以互换,*p是p的解引用表示a的值,而p可以和&b,&a互换,从这里来看引用很像指针,但实际上引用还是不同于指针的,除了表示方法不同,还有其他差别。例如引用必须在声明时初始化,而指针可以先声明后初始化

int a;
int &b;
b=a;

这样的写法是错误的编译器会报警告,所以必须在声明时对引用进行初始化
引用更接近const指针,必须在创建时初始化,一旦与某个变量关联起来,就无法改变

int &b=a;

实际上相当于

int *const b = a;

其中引用b扮演的角色与*b相同。
引用只能通过初始化来声明设置,不能通过赋值来设置,如果这样做:

int a=100;
int *p=&a;
int &b=*p;
int c=50;
p=&c;

将b初始化为*p使得b指向a,接下来将p指向c并不能改变b引用的是a的事实。

  • 将引用作为函数参数
    -
    引用经常被用作参数,使得函数中变量名作为调用程序中的变量名。 这种传递参数的方法称为引用传递。按引用传递允许被调用的函数访问调用函数中的变量。c语言只能进行值传递,是调用函数的变量的值的临时拷贝。所以c语言使用指针传递。例如:

    #include<iostream>
    using namespace std;
    void swap(int a,int b)
    {
    int tmp=a;
    a=b;
    b=tmp;
    }
    void mswap(int &a,int &b)
    {
    int tmp =a;
    a=b;
    b=tmp;
    }
    int main()
    {
    int a=2;
    int b=3;
    swap(a,b);
    cout<<" a = "<<a<<" b = "<<b<<endl;
    mswap(a,b);
    cout<<" a = "<<a<<" b = "<<b<<endl;
    system("pause");
    return 0;
    }

    第一个函数swap调用后是对a,b的值拷贝调用函数后不能改变a,b的值不能完成交换,而第二个函数mswap的参数是引用,可以直接改变a,b的值完成操作。这里写图片描述

猜你喜欢

转载自blog.csdn.net/weixin_40853073/article/details/81393525