C++ 引用

发布时间 2023-04-03 22:08:20作者: ImreW

(一)多重含义

C++中的 * 和 & 有多重含义,在不同的使用条件下有不同的意思:

1.*

int *p = &a;   /1.指针
a = a * b;     /2.乘法
*p = 100;      /3.指向

2.&

int c = a&b;    /1.位运算 转换为二进制
int *p = &a;    /2.取地址
int  a = 100;
int & ar = a;   /3.引用

(二)引用的定义

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它与引用的变量共用同一块内存空间。

格式如下:

类型 & 引用变量名(对象名) = 引用实体

  • 注意这里的空格是可选的,即
    • &符号与前后均可以有一个空格;如下:int & ra=a;
    • &符号与类型挨着,如下:int& ra=a;
    • &符号与引用名称挨着,如下:int &ra=a;
int main()
{
int a =100; \\定义变量名
int b = a;\\将a的值赋给变量
int &c = a;\\引用 将c作为a的别名 c11中成为左值引用
return 0;
}

在这里就是相当于一个实体取了两个名字分别为a和c,并且在这个空间中不开辟新的空间。

(三)引用的特点

  1. 定义引用时必须给初始化
  2. 没有空引用
  3. 没有所谓的二级引用
  4. 一个变量可以有多个引用(就相当于一个变量有好几个别名,这是可以的)

 

总而言之:
引用本身是一个变量,但是这个变量又仅仅是另外一个变量一个别名,它不占用内存空间,它不是指针哦!仅仅是一个别名!

(四)对比指针与引用

我们以交换函数为例

1.使用指针交换两个整型值

int my _swap (int*ap, int*bp)
{
    assert(ap != NULL && bp != NULL);
    int tmp = *ap;*ap = *bp;*bp = *ap;
}
int main()
{
    int x = 10, y = 20;
    my_swap{&x,&y);
    cout<< "x = " << x << " y = " << y << endl;
    return 0;
}

2.使用引用交换两个指针

void my_swap (int& a,int& b)
{
    int tmp = a;a = b;
    b = tmp;
}
int main ()
{
    int x = 10, y = 20;my_swap(x,y) ;
    cout << " x = " << x<< " y = " << y << endl;
    return 0;
}

形参为指针时:第一句话一定要断言,必须判断空不空;并且在使用指针的时候 我们需要注意:是否为 野指针, 空指针 ,失效指针。
当我们使用引用时,不存在NULL引用,不需要判空,比指针更加安全

(五)引用与指针的区别

1.语法层面的区别

(1)从语法规则上讲,指针变量存储某个实例(变量或对象)的地址;

    引用是某个实例的别名。

(2)程序为指针变量分配内存区域;而不为引用分配内存区域。

int main()
{
    int a = 10;
    int* ip = &a;
    int& b = a;  \\b是a的别名 并没有分配新的空间
}

(3)解引用是指针使用时要在前加“*”;引用可以直接使用。

int main()
{
    int a = 10;
    int* ip = &a;
    int& b = a;  
    *ip = 100//对于指针使用加“*”
    b = 200//引用不需要“*”
    
}

(4)指针变量的值可以发生改变,存储不同实例的地址;

    引用在定义时就被初始化,之后无法改变(不能是其他实例的引用)。

int main()
{
    int a = 10,b = 20;
    int* ip = &a;
    ip = &b ;
    int& c = a;
    c = b;   //b的值给c实则是把b的值给a,将a的值改为20
}

(5)指针变量的值可以为空(NULL,nullptr);没有空引用。

(6)指针变量作为形参时需要测试它的合法性(判空NULL);

    引用不需要判空。

(7)对指针变量使用"sizeof"得到的是指针变量的大小;

    对引用变量使用"sizeof"得到的是变量的大小。

int main()
{
    double dx = 10;
    double* dp = &dx;
    double& a = dx; 
    printf("sizeof(dp):%d\n", sizeof(dp));
    printf("sizeof(a):%d", sizeof(a));
}

运行结果:

 

(8)理论上指针的级数没有限制;但引用只有一级。

    即不存在引用的引用,但可以有指针的指针。

(9)++引用与++指针的效果不一样。

例如就++操作而言:

int main()
(
    int ar[5] = { 1,2,34,5 };
    int* ip = ar; //数组首元素地址
    int& b = ar[O]; //数组首元素的别名叫b
    ++ip;  //由0下标的地址指向1下标的地址
    ++b;  //由0下标指向1下标
}