引用

定义:引用就是已经定义的变量的别名。

语法:Type& name = var;

eg: int a = 0;
   int& b = a;  // b 就是 a 的别名
   b = 5;       // 操作 b 就是操作 a
引用在定义的时候必须用同一种类型进行初始化,a,b类型相同。

含义:在C++中可以对同一段内存起不同的名字。

1. 引用代替指针

void swap( int& a , int& b )  //同一变量的地址
{
  int temp = a;
  a = b;
  b = temp;  
}

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

int main(void)
{
  int a=1,b=2;
  swap(a,b);
  return 0;
}

2. const引用

  语法:const Type& name = var;

  含义:const引用让变量拥有只读属性。

int a = 4;
const int& b = a;
b = 5;                 // error 

  注:引用中不可以用常量来初始化。const引用可以。

      int& a = 1;   //error
const int& a = 1;   //此时编译器会创建只读常量,内存创建四个字节地址,用b作为其别名。本质还是变量
int *p = (int *)&a; // 用p将只读变量a转化为普通变量
*p = 5 ;       // ok a==5

  const引用的类型与初始化变量的类型

    a. 相同时:初始化变量为只读变量

    b. 不同时:创建一个新的只读变量

char c = 'c';       // c是常量
char& rc = c;       // rc是只读变量
const int& trc = c; // trc是新的只读变量,初始化类型与const引用类型不同,新的内存地址
rc = 'a';
printf("c = %c ", c);      // a
printf("rc = %c ", rc);    // a
printf("trc = %c ", trc);  // c

3.引用在C++内部的实现是指针常量

  指针常量规定了指针指向的地址不可变。使用时引用 a 相当是 *a。

  Type& name;   <==>  Type* const  name;

void fun(int& a)    { a = 5;}  //等价
void fun(int* const a)    {*a = 5;}

4. 指针与引用的区别

  1. 引用在创建时必须初始化,以后不可以代表其他变量(c语言中指针可以指向其他变量)。

  2. const引用使其变量拥有只读属性(C语言指针可以被const修饰为只读变量或者常量)。

  3. 所有对引用的操作可以直接作用于代表的变量(c语言中解指针才是)。

#include <stdio.h>

int a = 1;

struct SV
{
    int& x;
    int& y;
    int& z;
};

int main()
{
    int b = 2;
    int* pc = new int(3);
    SV sv = {a, b, *pc};        // 结构体成员全部为引用,成员地址空间不连续。
    int& array[] = {a, b, *pc}; // error  数组成员全部为引用 ,成员地址空间不连续,与C语言数组空间连续冲突,C++不支持引用数组。  
                                // 在C++编译器的角度引用是别名,直接代表变量。在C编译器的角度中指针常量是一个常量。
    
    printf("&sv.x = %p
", &sv.x);   // 成员地址在静态存储区
    printf("&sv.y = %p
", &sv.y);   // 成员地址在栈区
    printf("&sv.z = %p
", &sv.z);   // 成员地址在堆区
                                     
    delete pc;
    
    return 0;
}
原文地址:https://www.cnblogs.com/zsy12138/p/10679117.html