1、引用作为变量的别名存在,因此可以在一些场合代替指针。

   引用相当于指针来说具有更好的可读性和实用性。

  例如:

  

/*  编译环境
gcc version 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1)
*/
#include <stdio.h> void sewp_C(int *a, int *b) //使用指针进行 a 和 b 之间的交换。
{
int t;
t = *a;
*a = *b;
*b = t;
} void sewp_C_fun(int &a,int &b)//使用 引用实现 a 和 b之间的交换
{
int t = a;
a = b;
b = t;
} int main(int argc, char *argv[])
{
int a = ,b = ;
printf("Begin...\n");
sewp_C(&a,&b);
printf("a = %d\tb = %d\n",a,b); //打印结果 a = 0 b = 1
sewp_C_fun(a,b);
printf("a = %d\tb = %d\n",a,b); //打印结果 b = 1 a = 0
printf("End...\n");
return ;
}

  运行结果:

Begin...
a = b =
a = b =
End...

 通过两种方式实现,两个数内容的交换。 使用指针调用函数则为:sewp_C(&a,&b);    而使用引用则为:sewp_C_fun(a,b);  这样看起来更加直观。

  注意:在函数形参中的引用可以不用初始化。

特殊的引用:const 引用

  在C++中声明const  引用格式: const Type & name = var;

  const 引用可以让变量具备 只读属性

/*  编译环境
gcc version 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1)
*/
#include <stdio.h> int main(int argc, char *argv[])
{ printf("Begin...\n");
int a = ;
const int & b = a;
int* p = (int*) &b; //b = 10;//错误 变量拥有只读属性
*p = ;
printf("a = %d\tb = %d\n",a,b); //打印结果 a = b = 20
printf("End...\n"); return ;
}

   运行结果:

Begin...
a = b =
End...

  如果将 const int & b = a; 替换成 :const int & b = 1; 这样将使用一个常量来初始化引用。

  

引用是否有自己的存储空间?
  

  

#include <stdio.h>

struct Tqr
{
char & r;
}; int main(int argc, char *argv[])
{
char c = 'c';
char & rc = c;
Tqr ref ={c};
int *p;
printf("Begin...\n");
printf("sizeof(char &) = %d\n",(int)sizeof(char &)); // 打印变量char &所占用的大小 占用一个字节
printf("sizeof(rc) = %d\n",(int)sizeof(rc)); // rc 占用一个字节
printf("sizeof(Tqr) = %d\n",(int)sizeof(Tqr)); //占用4个字节
printf("sizeof(ref.r) = %d\n",(int)sizeof(ref.r)); //ref.r 占用1个字节 (字符变量)
printf("sizeof(p) = %d\n",(int)sizeof(p)); printf("End...\n");
return ;
}

  打印结果:  

Begin...
sizeof(char &) =
sizeof(rc) =
sizeof(Tqr) =
sizeof(ref.r) =
sizeof(p) =
End...

  可以看出,Tqr 所占的空间为4 所以引用是占用4个字节的大小的。

  所以可以猜测 引用 在C++中的实现就应该是使用指针来实现的。

  

引用的意义:其主要作用在大多数情况下是为了代替指针。

  可以满足多数需要使用到指针的场合。

  可以避开由于指针操作不当而带来的内存错误

  简单易用,功能强大。

引用在函数返回值中的使用。

  

/*  编译环境
gcc version 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1)
*/
#include <stdio.h>
int& func1(void)
{
int a=;
return a;
}
//相当于c 语言中的
/*
int * func1(void)
{
int a= 5;
return &a;
}
*/
int& func2(void)
{
static int b = ;
return b;
}
/*
int * func2(void)
{
static b = 10;
return &b;
}
*/
int main(int argc, char *argv[])
{
int &a = func1();
int &b = func2();
printf("Begin...\n");
//运行将会产生段错误
//产生段错误的原因是,因为 在func1 中a 是一个局部变量,在执行完成后将会被销毁
//a 指向一个被销毁的空间,自然会出错。而如果使用static 来修饰将不会出现段错误。
//因为使用static 会将变量声明为一个全局的变量。
printf("a = %d\tb = %d\n",a,b); //打印结果 a = 未知数 b = 10
printf("End...\n");
return ;
}

  运行结果:

Begin...
Segmentation fault (core dumped)

  在int a 替换为  static int a 后运行结果:(能够正常运行)

Begin...
a = b =
End...

小结:

  引用作为变量别名存在目的是为了代替指针。

  cons引用可以让变量获得只读属性。

  引用的最终实现还是指针。

  引用可以尽可能的避开内存错误。

  

  

C++ 引用深入理解的更多相关文章

  1. 【转】C++ 11 右值引用的理解

    右值引用的目的之一,是为了C++中一个比较影响性能的问题:拷贝临时对象,例如,在 int foo(){ ... } int x; x = foo(); 中,在第三句中,发生了以下的事情: 1.销毁 x ...

  2. Java中“指针”的解释以及对“引用”的理解

    Java中"指针"的解释以及对"引用"的理解 初学Java面对对象编程,对于一些概念还真的有点难以理解,主要是因为不由自主的联系到以前学过的C语言知识,时不时的 ...

  3. 《深入理解计算机系统》第7章:重定位PC相对引用的理解

    在第七章<链接>中的静态链接有对符号进行重定位PC相对引用的处理,书上对应的还有公式,但不是很好理解.现做实验对公式进行理解(公式内容如有兴趣可以参考原文)

  4. 对指针和引用的理解(c++)

    1.指针 typedef说明一种新类型名,来代替已有类型名. a.案例:typedef char* String_t和#define String_d char *这两句在使用上的区别? 1)前者声明 ...

  5. Java中对象和引用的理解

    偶然想起Java中对象和引用的基本概念,为了加深下对此的理解和认识,特地整理一下相关的知识点,通过具体实例从两者的概念和区别两方面去更形象的认识理解,再去记忆. 一.对象和引用的概念: 在Java中万 ...

  6. Spring的3级缓存和循环引用的理解

    此处是我自己的一个理解,防止以后忘记,如若那个地方理解不对,欢迎指出. 一.背景 在我们写代码的过程中一般会使用 @Autowired 来注入另外的一个对象,但有些时候发生了 循环依赖,但是我们的代码 ...

  7. python 05 关于对python中引用的理解

    数据的在内存中的地址就是数据的引用. 如果两个变量为同一个引用,那么这两个变量对应的数据一定相同: 如果两个变量对应的数据相同,引用不一定相同. 通过id(数据)可以查看数据对应的地址,修改变量的值, ...

  8. Office EXCEL 的绝对引用和相对引用如何理解

    比如C1 = A1+B1,则我把C1的单元格往下拖拉的时候,C2会自动等于A2+B2,C3会自动等于A3+B3,而如果让G1 = $E$1+$F$1,则把G1单元格往下拖拉的时候,G2G3单元格都不会 ...

  9. java import跨包引用类理解

    当前类要用其他类时,import具体包路径+.+具体的类 import引入的是被引用类的class文件,所以当我们build path第三方jar包时, 要用他们的类,要把jar包add to bui ...

随机推荐

  1. windos下hosts文件

    win+R c:\windows\system32\drivers\etc

  2. linux系统基础优化及高级操作命令

    Linux基础系统优化 引言没有,只有一张图. Linux的网络功能相当强悍,一时之间我们无法了解所有的网络命令,在配置服务器基础环境时,先了解下网络参数设定命令. ifconfig 查询.设置网卡和 ...

  3. Maven项目解决Remove '@override' annotation终极方案

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...

  4. java.sql.SQLSyntaxErrorException: ORA-01795: 列表中的最大表达式数为 1000

    后台报了一些异常日志,查阅后发现在 oracle 数据库中使用 in 关键字条件不能超过 1000 个,当时写查询语句时没有关注这个问题 总结一下解决方法 1.分多次查询,对查询要求不高的话.把入参的 ...

  5. EMQ插件组合实现物联网边缘平台的设备通信管理

    上一篇随笔我简单的记录了我对EMQ插件开发的了解过程,最后发现还是可以组合复用已有插件,因此这篇随笔用于记录使用的情况以及是否达到预期. 首先测试mysql认证插件的使用方式: emqx_auth_m ...

  6. 代码实现:判断101-200之间有多少个素数(质数),并输出所有素数。 程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。

    package com.loaderman.Coding; /* 判断101-200之间有多少个素数(质数),并输出所有素数. 程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能 ...

  7. matplotlib之折线图

    1.案例一 # coding=utf-8 from matplotlib import pyplot as plt import random # 设置字体相关 from matplotlib imp ...

  8. nodejs之express框架商品管理系统登录功能

    1.该系统主要使用express.body-parser.express-session.ejs.mongodb-connect . npm install express --save npm in ...

  9. 【DVWA】File Upload(文件上传漏洞)通关教程

    日期:2019-08-01 17:28:33 更新: 作者:Bay0net 介绍: 0x01. 漏洞介绍 在渗透测试过程中,能够快速获取服务器权限的一个办法. 如果开发者对上传的内容过滤的不严,那么就 ...

  10. malloc分配内存进行对齐的操作

    昨天面试高通Linux Kernel,面试官考了一个malloc内存对齐的问题,我晚上的时候细细的想了一下,实在是学习的不到位. 有的时候真的应该感谢,像是Qt.Ubuntu Gcc的编译器,他们做的 ...