Date
May. 20th, 2024
 
2024年 4月 13日

Post: C++ Primer 007 : 引用

C++ Primer 007 : 引用

Published 12:05 May 23, 2013.

Created by @ezra. Categorized in #Programming, and tagged as #C/C++.

Source format: Markdown

Table of Content

本篇主要介绍C++ 中的引用。

什么是引用

引用实际上不是一种独立的数据类型,类似于 C 中的指针,本质就是对变量起别名,例如:

int a = 66;
int& b = a;// 表示给变量 a 起别名为 b
/*
&b : 取地址
1&2: 按位与
*/
b++;// b = 67  a = 67
int& c = b;// c = 67

引用和指针的比较

  • 引用必须初始化,指针可以不初始化
int& b; // 错误,必须初始化
int* p; // 野指针
  • 引用不可以为空,指针可以为空
int& a = NULL; // 错误
int* p = NULL;

关于这一点需要注意:

// 常引用
const int& a = NULL; // 实际上相当于 0
const int& b = 20;
  • 引用不可以更换目标,指针可以
int a = 66;
int& b = a;

int m = 118;
b = m; // 这里相当于赋值,m 的值给 a 了

int* p = &a;
p = &m;
  • 不能声明引用型数组,可以声明指针型数组
int data[5]; // 整型数组
int* data[5]; // 指针数组
char data[5]; // 字符数组
int& data[5];// 引用数组 错误

引用和指针的使用说明

  • 指针中的*停靠问题
int* p;
int * p;
int *p;
// 上面三种方法都是可以的

int* p,*q;
int *p,*q;
// 效果等价
  • 引用中&的停靠问题
int a = 66;
int& b = a;
int & b = a;
int &b = a;
int &r = a,&m = a;
// 同样没有什么区别
  • 当定义多个指针/引用时,可以起别名
int *p,*q,*r;
typedef int* PINT;
PINT p,q,r; //定义三个指针

typedef int& RINT;
int b,d;
RINT a = b,c = d;
  • 可以定义指向指针的指针,但是不可以定义指向引用的指针
int a = 66;
int& b = a;
int* pa = &a;

int** pa = &pa;
int&* pa = &b; // 错误 指向引用的指针
  • 可以定义引用指针的引用,不可以定义引用引用的引用(可以给指针定义引用,不可以给引用定义引用)
int a = 66;
int& b = a;
int* pa = &a;

int*& pb = pa;// 指针的引用
int&& c = b; // 错误
  • 可以定义指针数组,但是不能定义引用数组,可以定义数组的引用
int data[5];  //整型数组
int* data[5]; //指针数组
int& data[5]; //引用数组 错误

int (*p)[5]; // 数组指针
int (&p)[5]; // 数组引用

引用作为函数的形参

  • 引用作为函数的形参,能够修改实参的值

  • 引用作为函数的形参,可以避免参数传递过程中数据的拷贝

  • 通过将参数定义为常引用,防止在函数内部对实参做修改,同时还可以接受常量型实参

  • 引用作为形参,实际上就是址传递

引用作为函数的返回值

永远不要返回局部变量(包含函数的形参)的引用,可以返回静态局部变量/全局变量/动态内存/实参/结构体的成员的引用,这样是安全的。

Pinned Message
HOTODOGO
I'm looking for a SOFTWARE PROJECT DIRECTOR / SOFTWARE R&D DIRECTOR position in a fresh and dynamic company. I would like to gain the right experience and extend my skills while working in great teams and big projects.
Feel free to contact me.
For more information, please view online résumé or download PDF
本人正在寻求任职 软件项目经理 / 软件技术经理 岗位的机会, 希望加⼊某个新鲜⽽充满活⼒的公司。
如有意向请随时 与我联系
更多信息请 查阅在线简历下载 PDF