C++指针与引用的异同
目录
- 1、引用与指针的区别
- 1.1 相同点
- 1.2 区别
1、引用与指针的区别
指针和引用的原理非常的相似,所以很多时候尤其是面试的时候经常会拿来比较。
本文来梳理一下引用和指针的一些异同。
1.1 相同点
两者都是关于地址的概念。
指针本身是一个变量,它存储的值是一块内存地址,而引用是某一个内存的别名。我们可以使用指针或引用修改对应内存的值。
1.2 区别
- 引用必须在声明时初始化,而指针可以不用
我们无法声明一个变量引用再给它赋值,只能在声明的同时进行初始化:
int a = 3; int &b; // 非法 int &c = a; // 合法
而指针没有这个限制:
int *p; // 合法
- 引用只能在声明时初始化一次,之后不能指向其他值,而指针可以
引用一旦声明无法更改,但指针可以。某种程度上来说,引用类似于常量指针。
int a = 3; int &b = a; int const *p = &a;
- 引用必须指向有效变量,指针可以为空
这是两者一个使用上巨大的区别,我们拿到一个引用可以放心地使用, 因为它一定不会为空。而指针则不然,有可能为空指针,必须要经过判断才能使用。
sizeof
运算结果不同
sizeof
函数可以计算变量内存块的大小,但如果我们对指针使用sizeof
得到的是指针这个变量本身的占用内存大小,而不是指针指向的变量的内存大小。而引用则没有这个问题。
- 有指针的引用,但是没有引用的指针
我们先来看引用的指针:
int a = 3; int &b = a; int *p = &b;
这段代码并不会报错,但如果我们真的去运行了,会发现p就是一个普通的int
型指针,它指向的是变量a
。因为b是一个引用,它的地址和a
相同。所以我们定义一个指向b
的指针,实际上就是定义指向a
的指针。这也是指向引用的指针不存在的原因。
再来看看指针的引用,指针的引用是存在的,也很好理解,本质上就是指针的一个别名:
int a = 3; int *p = &a; int *&pt = p;
pt
也可以指向别的变量,也可以修改解引用的值,使用上它和p没有任何区别。
除了上面说的这些之外,指针和引用还在一些细小的方面有一些差别。例如自增和自减的含义不同,指针的自增和自减代表的是指针的移动,而引用的自增自减则是变量的值发生变化。
到此这篇关于C++指针与引用的异同的文章就介绍到这了,更多相关C++指针与引用异同内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
文章转自 公众号:Coder梁(ID:Coder_LT)
相关推荐
-
c++中为什么可以通过指针或引用实现多态详解
引言: 在c++中司空见惯的事情就是:可以通过指针和引用可以实现多态,而对象不可以. 那为什么?让我们来解开这神秘的暗纱! 1. 类对象的存储方式: 在一个类的实例中,只会存放非静态的成员变量. 如果该类中存在虚函数的话,再多加一个指向虚函数列表指针-vptr. 例如声明如下两个类,并分别实例化两个对象,它们的内存分配大致如下:(vptr具体在什么位置,与编译器有关,大多数都在开始处) class base { public: virtual ~base() {}; virtual string
-
详解C++数组和数组名问题(指针、解引用)
目录 一.指针 1.1 指针变量和普通变量的区别 1.2 为什么需要指针 1.3 指针使用三部曲 二.整形.浮点型数组 2.1 数组名其实是特殊的指针 2.2 理解复杂的数组的声明 2.3 数组名a.数组名取地址&a.数组首元素地址&a[0].指向数组首元素的指针*p 2.4 对数组名以及取值符&的理解 三.字符数组数组名 一.指针 1.1 指针变量和普通变量的区别 指针:指针的实质就是个变量,它跟普通变量没有任何本质区别.指针完整的应该叫指针变量,简称为指针. 是指向的意思.指针
-
C++ Primer注解之引用和指针
引用(reference) 引用: 指的是左值引用(lvalue reference) 引用:取小名,达到绑定对象的作用,而不是将初始值拷贝给引用 special: 不能和 字面值 和 计算结果 绑定 引用不是对象 对引用的操作,都是在与之绑定的对象上进行的 除了两种例外外,引用的类型 和 与之绑定的对象 要严格匹配 int i = 1024; int &r = i; //√ int型的r,来引用int型的i double dval = 3.14; int &reval = dval; /
-
C++中指针的引用*&的具体使用
指针和引用形式上很好区别,但是他们似乎有相同的功能,都能够直接引用对象,对其进行直接的操作. 首先,引用不可以为空,但指针可以为空.前面也说过了引用是对象的别名,引用为空--对象都不存在,怎么可能有别名!故定义一个引用的时候,必须初始化.因此如果你有一个变量是用于指向另一个对象,但是它可能为空,这时你应该使用指针:如果变量总是指向一个对象,i.e.,你的设计不允许变量为空,这时你应该使用引用. 如指针一样,指针的引用容易使人困惑. 我们注意到类似下面这种语法 void func(int *&x)
-
c++基础学习之如何区分引用和指针
目录 前言 1.引用 1.1引用的概念 1.2引用的定义 1.3引用与const 1.4引用的使用场景 2.指针 2.1概念 2.2获取对象的地址 2.3利用指针访问对象 2.3空指针 2.4野指针 2.4.1概念: 2.4.2野指针的产生: 2.5各个指针类型的含义 2.6 void* 指针 2.7指向指针的指针 2.8指针与const 3.指针和引用的区别 总结 前言 对于我刚学c++的时候,最令我头疼的是引用和指针,老是区分不了它们,那么今天笔者将我的学习到的笔记总结出来,让大家少走一些坑
-
实例详解C++中指针与引用的区别
目录 前言 1.指针的声明 2.使用new来分配内存 3.malloc 与 new 的区别 4.引用的声明与本质 总结 前言 在计算机存储数据时必须要知道三个基本要素:信息存储在何处?存储的值为多少?存储的值是什么类型?因此指针是表示信息在内存中存储地址的一类特殊变量,指针和其所指向的变量就像是一个硬币的两面.指针一直都是学习C语言的难点,在C++中又多了一个引用的概念.初学时很容易把这两个概念弄混,下面就来通过一些例子来说明二者之间的差别. 1.指针的声明 上文中提到,指针和其所指向的变量就像
-
深入学习C++智能指针之shared_ptr与右值引用的方法
目录 1. 介绍 2. 初始化方法 2.1 通过构造函数初始化 2.2 通过拷贝和移动构造函数初始化 2.3 通过 std::make_shared 初始化 2.4 通过 reset 方法初始化 3. 获取原始指针 4. 指定删除器 5. 参考链接 1. 介绍 在 C++ 中没有垃圾回收机制,必须自己释放分配的内存,否则就会造成内存泄露.解决这个问题最有效的方法是使用智能指针(smart pointer).智能指针是存储指向动态分配(堆)对象指针的类,用于生存期的控制,能够确保在离开指针所在作用
-
C++指针与引用的区别案例详解
C++中指针和引用的区别 从概念上讲.指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变. 而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一个变量). 在C++中,指针和引用经常用于函数的参数传递,然而,指针传递参数和引用传递参数是有本质上的不同的: 指针传递参数本质上是值传递的方式,它所传递的是一个
-
C++中的数组引用和指针引用
目录 C++中的数组引用和指针引用 一.引用的本质 二.数组的引用 三.指针的引用 C++中的数组引用和指针引用 一.引用的本质 我们在讲解引用之前需要知道为什么C++中会单独提出引用这个概念,在前面也提到在C++从一定角度上是C语言的升级版,其实引用时和C语言中的指针一样的功能,并且使得语法更加简洁.既然提到和指针功能相同,那么引用的功能其实就是给空间取别名. 代码解析: #define _CRT_SECURE_NO_WARNINGS #include<iostream> using nam
-
C++指针与引用的异同
目录 1.引用与指针的区别 1.1 相同点 1.2 区别 1.引用与指针的区别 指针和引用的原理非常的相似,所以很多时候尤其是面试的时候经常会拿来比较. 本文来梳理一下引用和指针的一些异同. 1.1 相同点 两者都是关于地址的概念. 指针本身是一个变量,它存储的值是一块内存地址,而引用是某一个内存的别名.我们可以使用指针或引用修改对应内存的值. 1.2 区别 引用必须在声明时初始化,而指针可以不用 我们无法声明一个变量引用再给它赋值,只能在声明的同时进行初始化: int a = 3; int &
-
C++类的继承和派生及指针安全引用
目录 一.继承和paisheng 1.继承和派生的基础概念 2.如何定义子类 3.吸收和改造父类成员.添加新成员 二.指针引用 1.指针和引用的异同 2.指针的安全隐患 一.继承和paisheng 1.继承和派生的基础概念 继承指从现有类获得其特性,派生指从已有类产生新的类.原有的类称为基类或父类,新生的类称为子类或派生类.当子类只有一个父类时称为单继承,当子类含有多个父类时称为多继承.如果基类A直接参与了派生类B的派生过程,那么A类称为直接基类:基类的基类称为间接基类. 2.如何定义子类 定义
-
简单谈谈C++中指针与引用的区别
指针与引用是C++中两个很重要的概念,它们功能看过去很相似,就是都是间接引用某个对象,那么我们应该在什么时候使用指针,什么时候使用引用呢,下面请允许我慢慢道来: 1.永远不要使用一个指向空值的引用.一个引用必须始终指向某个对象,所以当你确定使用一个变量指向某个对象时,但是这个对象在某些时间可能指向控制,这时候你就必须把变量声明为指针类型,而不是引用!当你确定这个变量始终指向某个对象是,这时候你就可以把变量声明为引用类型. char *str=0; //设置指针为空值 char &s=*str;
-
深入理解c++指针的指针和指针的引用
展示一下使用指针的指针和指针的引用修改传递给方法的指针,以便更好的使用它.(这里说的指针的指针不是一个二维数组) 为什么需要使用它们 当我们把一个指针做为参数传一个方法时,其实是把指针的复本传递给了方法,也可以说传递指针是指针的值传递. 如果我们在方法内部修改指针会出现问题,在方法里做修改只是修改的指针的copy而不是指针本身,原来的指针还保留着原来 的值.我们用下边的代码说明一下问题: int m_value = 1; void func(int *p) { p = &m_value; } i
-
浅谈JavaScript中的this指针和引用知识
this是javascript的一个关键字,随着函数使用场合不同,this的值会发生变化.但是总有一个原则,那就是this指的是调用函数的那个对象. this指针在传统OO语言中,是在类中声明的,表示对象本身.在JavaScript中,this表示当前上下文,即调用者的引用 ********this永远指向的是(函数对象)的所有者 this和全局对象: var a = 1; function foo(){ var b = 2; console.log(this.a+b);//3 } foo();
-
C++ 中指针和引用有什么区别详解
C++ 中指针和引用有什么区别详解 1.从内存上来讲 系统为指针分寸内存空间,而引用与绑定的对象共享内存空间,系统不为引用变量分配内容空间. 2指针初始化以后可以改变指向的对象,而引用定义的时候必须要初始化,且初始化以后不允许再重新绑定对象. 3.所以引用访问对象是直接访问.指针访问对象是间接访问. 4.如果pa是指针,那么*pa就是引用了. 但是两者在作为形参的时候非常相似,区别是指针拷贝副本,引用不拷贝.程序如下: #include<stdio.h> void pt(int * pta,
-
C++中指针和引用的区别详解
C++中指针和引用的区别 指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法. 1.指针和引用的定义和性质区别: (1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元:而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已.如: int a=1;int *p=&a; int a=1;int &b=a; 上面定义了一个整形变量和一个指针变量p,该指针变量指向a的存储单元,即p的值是a存储单元的
-
c++ 指针与引用的区别介绍及使用说明
指针与引用看上去完全不同(指针用操作符"*"和"->",引用使用操作符"."),但是它们似乎有相同的功能.指针与引用都是让你间接引用其他对象.你如何决定在什么时候使用指针,在什么时候使用引用呢? 首先,要认识到在任何情况下都不能使用指向空值的引用.一个引用必须总是指向某些对象.因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量.相反,如果变量肯定指向一
-
C/C++ 数组和指针及引用的区别
C/C++ 数组和指针及引用的区别 1.数组和指针的区别 (1)定义 数组是一个符号,不是变量,因而没有自己对应的存储空间.但是,指针是一个变量,里面存储的内容是另外一个变量的地址,因为是变量所以指针有自己的内存空间,只不过里面存储的内容比较特殊. (2)区别 a.对于声明和定义,指针和数组是不相同的,定义为数组,则声明也应该是数组,不可混淆 b.当作下标操作符时,指针和数组是等价的.a[i]会被编译器翻译成*(a+i). c.当数组声明被用作函数形参的时候,数组实际会被当作指针来使用. (3)
-
C/C++中指针和引用之相关问题深入研究
一.基本知识指针和引用的声明方式:声明指针: char* pc;声明引用: char c = 'A' char& rc = c; 它们的区别:①从现象上看,指针在运行时可以改变其所指向的值,而引用一旦和某个对象绑定后就不再改变.这句话可以理解为:指针可以被重新赋值以指向另一个不同的对象.但是引用则总是指向在初始化时被指定的对象,以后不能改变,但是指定的对象其内容可以改变. ②从内存分配上看,程序为指针变量分配内存区域,而不为引用分配内存区域,因为引用声明时必须初始化,从而指向一个已经存在的对
随机推荐
- Docker网络之单host网络及使用案例
- javascript秒数倒计时自动跳转代码
- JS实现的简单轮播图运动效果示例
- ASP.NET Core Kestrel 中使用 HTTPS (SSL)
- 微信小程序 websocket 实现SpringMVC+Spring+Mybatis
- JS实现在状态栏显示打字效果完整实例
- 浅析DataBinder.Eval和Eval的区别
- phpmailer发送邮件之后,返回收件人是否阅读了邮件的方法
- php生成无限栏目树
- PHP mail()函数使用及配置方法
- 使用Python保存网页上的图片或者保存页面为截图
- python 判断自定义对象类型
- 点图片上一页下一页翻页效果
- 两个多选select(multiple左右)添加、删除选项和取值实例
- Python win32com 操作Exce的l简单方法(必看)
- 深入N皇后问题的两个最高效算法的详解
- 使用IE6看老赵的博客 jQuery初探
- 3种不同的ContextMenu右键菜单实现代码
- 理解javascript中的闭包
- js获取滚动距离的方法