想必大家对C++中的指针都有所了解,但是什么是引用呢?C++11标准引入了“引用”的新功能。

引用

引用(reference):给对象起了另外一个名字,引用类型引用(refers to)另外一种类型,通过将声明符写成&d的形式来定义引用类型,其中d是声明的变量名:

int val = ;
int &d = val;

可以认为变量名就是一个可以操控内存的标签,那么引用就可以理解为另一个标签。新定义的标签和原来的标签都可以访问存放在内存中的数据。
例如:

#include <iostream>
#include <cmath>
using namespace std; //声明
void add(int &a,int b);
bool& isZero(float f); int main(){
double dval = 0.1;
double &d = dval;
d+=0.1;
cout << "d is " << d << endl; //使用引用作为函数参数
int val = ;
add(val,);
cout << "val is " << val << endl; //使用引用作为函数返回值
  float fv = 0.000000004f;
bool &v = isZero(fv);
if(v)
cout << "float 0.000000004 is zero" << endl;
else
cout << "float 0.000000004 is not zero" << endl; return ;
} //定义
void add(int &a,int b){
a+=b;
}
bool& isZero(float f){
bool b = false;
if(abs(f) < 0.0000001)
b = true;
bool &rb = b;//不推荐返回局部变量的引用,因为当isZero函数执行完后,b变量的内存很有可能会被回收
return rb;
}

输出结果为:

d is 0.2
val is 25
float 0.000000004 is zero

C++官方推荐使用引用以一种更安全的方式向函数传递数据和获取返回值。

可以使用常量引用引用一个常量,
比如:

const int &i = ;

指针

指针(pointer):是可以指向(point to)另外一种数据类型的数据类型,通过将声明符写成*d的形式定义指针,其中d是变量名。
取地址符(&):获取对象的地址。
解引用符(*):获取指针所指向的对象。

int v = ;
int *p = &v;
int **m = &p;

p是一个int类型的指针,指向一个int类型,上面的例子中指向了变量v。
m是一个int*类型的指针,指向一个int*类型,上面的例子中指向了变量p。
这里说指向某个对象就是指存放某个对象的地址。指针就是指地址,地址就是指针。指针变量就是存放内存单元编号的变量,或者说指针变量就是存放内存地址的变量。

这张图片解释了上面这段代码的地址指向问题,变量p存放了变量v的内存地址,变量m存放了变量p的内存地址。

在判断某个对象的类型的时候,应该从右向左阅读(离变量名最近的符号对变量类型有最直接的影响),比如

int ****p;
int ****&r = p;

上面的int ****p;离p最近的是第四个*,所以p是一个指针,剩余的部分确定该指针指向的类型,第四个*号左边是int ***,所以指针p指向一个int ***类型。再看变量r,离r最近的是&,所以r是引用,剩余的部分确定该引用引用的类型,剩余的是int ****,所以r引用了一个int ****类型的变量。

空指针不指向任何对象,使用字面值NULL表示,c++11标准还提供了字面值nullptr也可以获得空指针。

void*是一种特殊的指针类型,可用于存放任意对象的地址。一个void*指针存放着一个地址,这一点和其他指针类似。但是不能直接操作void *指针所指的对象,因为并不知道对象到底是什么类型。如果要使用void *所指的对象,应该使用强制类型转化。

引用与指针

引用和指针的比较:
1.引用不能引用NULL。
2.一旦引用被初始化引向某一个对象后,它就不能再引向另一个对象。指针可以多次改变指向的对象。
3.引用在创建的时候,必须初始化。指针可以在被创建时不被初始化,可以等需要的时才初始化。
4.引用不是对象,没有实际的地址。指针是一个对象,有实际的地址。指针不能指向引用(因为引用不是对象)。

【C++】C++中的引用与指针的更多相关文章

  1. c++中的引用与指针的区别

    http://blog.csdn.net/lyd_253261362/article/details/4323691 c++中的引用与指针的区别 ★ 相同点: 1. 都是地址的概念: 指针指向一块内存 ...

  2. [ZZ]C++中,引用和指针的区别

    (1) 引用总是指向一个对象,没有所谓的 null reference .所有当有可能指向一个对象也由可能不指向对象则必须使用 指针. 由于C++ 要求 reference 总是指向一个对象所以 re ...

  3. 从编译器角度理解C++中的引用和指针

    欲分析指针和引用,则要分析变量名和地址之间的关系(不管你理解还是不理解,无论你是从老师那里听到的,还是网上看到的,应该都知道两句话:1. 指针就是地址,2.引用就是给变量起个别名) 所以我们就要来分析 ...

  4. C中有关引用和指针的异同

    参考于https://blog.csdn.net/wtzdedaima/article/details/78377201 C语言也学了蛮久的,其实一直都没有用到过或者碰到过引用的例子.前端时间再全面复 ...

  5. 使用java实现单链表----(java中的引用就是指针)

    //一直以为java中没有指针,其实java的引用就是指针,只不过堆栈中的引用储存了在堆中的地址,可以看做java中的指针.public class sibgleLink<E> { // ...

  6. C++中的引用和指针

    引用和指针有何区别?何时只能使用指针而不能使用引用?    引用是一个别名,不能为 NULL 值,不能被重新分配:指针是一个存放地址的变量.当需要对变量重新赋以另外的地址或赋值为 NULL 时只能使用 ...

  7. C++中引用与指针的区别(详细介绍)

    C++中引用与指针的区别(详细介绍) C++中的引用与指针的区别   指向不同类型的指针的区别在于指针类型可以知道编译器解释某个特定地址(指针指向的地址)中的内存内容及大小,而void*指针则只表示一 ...

  8. 在被调用函数中获取资源及C++中的引用

    #include <iostream> using namespace std; struct Teacher{ char name[64]; int age; }; //在被调用函数 获 ...

  9. C++ 中引用与指针的区别

    1.引用只是变量的一个别名,并不占用内存空间,而指针是一个变量,里面保存着被指向的变量在内存中的地址: 2 引用只能在定义时被初始化一次,之后不可变,而指针可变: 3 引用没有 const,指针有 c ...

随机推荐

  1. js根据银行卡号进行判断属于哪个银行并返回银行卡类型

    在做绑定银行卡,输入银行卡的时候,产品有这么一个需求,需要用户输入银行卡号的时候,显示对应的银行卡名称及简称.于是苦苦寻觅,终于找到了支付宝的开放API,银行卡校验接口 https://ccdcapi ...

  2. CentOS 通过yum在线安装MySQL5.7

    CentOS 通过yum在线安装MySQL5.7 Step1: 检测系统是否自带安装mysql # yum list installed | grep mysql Step2: 删除系统自带的mysq ...

  3. TF之RNN:matplotlib动态演示之基于顺序的RNN回归案例实现高效学习逐步逼近余弦曲线—Jason niu

    import tensorflow as tf import numpy as np import matplotlib.pyplot as plt BATCH_START = 0 TIME_STEP ...

  4. [ 高危 ]mt某站SQL注入

    RANK 24 金币    24 等价RMB  240 与上一漏洞同源所以只有24 数据包: GET /check?clientId=64915 HTTP/1.1 Host: xxx.meituan. ...

  5. Java网络编程案例---聊天室

    网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. java.net包中JavaSE的API包含有类和接口,它们提供低层次的通信细节.你可以直接使用这些类和接口,来专注于解决 ...

  6. SpringBoot+Jpa+MySql学习

    上一篇介绍了springboot简单整合mybatis的教程.这一篇是介绍springboot简单整合jpa的教程. 由于jpa的功能强大,后续会继续写关于jpa的介绍已经使用,本文只是简单介绍一下它 ...

  7. PAT (Advanced Level) Practise 1002 解题报告

    GitHub markdownPDF 问题描述 解题思路 代码 提交记录 问题描述 A+B for Polynomials (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 ...

  8. Kotlin基础(五)Kotlin的类型系统

    Kotlin的类型系统 一.可空类型 //s为null的话编译器会报错,没问号不能为空 fun strLen(s : String)=s.length //如果允许s为空可: fun strLen2( ...

  9. go defer笔记

    1.函数中return xxx非原子指令 2.函数返回过程:先给返回值赋值:再调用defer:最后回到调用函数中 即:返回值 = xxx; defer; return; 3.多个defer调用顺序类似 ...

  10. 潭州课堂25班:Ph201805201 django 项目 第一课 (课堂笔记)

    一.Django 现状   1.Django开发前景   1.1 老师做过的项目   ​ 项目图展示:     1.2 Django的厉害之处 在python中,与web开发环境相关的包有13045个 ...