`
lovnet
  • 浏览: 6706248 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

引用是特殊指针

 
阅读更多

很多人把指针和引用看成两个完全不同的东西,引用只是个别名,不占用实际内存,只不过操作起来有点像指针.实际上引用就是一个指针,只不过是个特殊的指针,编译器对它做了些特殊的处理.它也占用内存.但由于编译器做了特殊处理,你不能用&去取址,用sizeof得到的值也不会是4或者8,而是它引用的对象的size大小.

其实我们想想也知道,如果引用真只是个别名,没啥其他意思.那真是叫饱了撑着搞个引用出来啊.直接用本来的名字不就行了,为啥用它的别名啊.所以引用实际上也只就是保存一个地址值在那.

要区分指针和引用,先说下常量指针和指针常量两个概念.

常量指针和指针常量

觉得看着这两术语非常让人晕,非常容易混淆.如果不去管它们,直接看英语就一目了然了.

常量指针(pointer to constant)

我觉得翻译成常量指针不太好,应该说指向常量的指针,虽然多了几个字但意思清晰了很多.不过其实也还不够准确的.先举个简单的例子吧.

const int num = 88;

const int* p = # //p就是一个常量指针,它指向常量num.常量指针非得指向常量吗?不一定

int no = 99;

const int* pp = &no; //pp也是个常量指针,但不指向常量.

常量指针只是表示指针指向的对象的值不能通过指针的方式去改变.

所以*p = 123和*pp = 123这样去赋值都不行.但no = 123这样赋值却可以.

指针常量(constant pointer)

其实我觉得这里翻译成常量指针才更好点,constant是在前面做修饰语的.

int num = 44;

int* const pp = # //这样写也可以int const* pp = #

指针常量表示指针指向了某个地方之后不能再指向其他地方了.

所以如果int no = 55;

pp = &no; //这里就会出错,pp不能再指向no了

我们平时定义啥常量时都是要马上初始化才行的.指针常量也一样.

int* pp; //这样是可以

int* const pp; //这样就不行了.不过你可以赋空值.比如int* const pp = 0;

我们只要看const是位于类型关键字左边还是右边.比如上面在int左边则是修饰指向的变量,如果在int右边则是修饰指针本身.

如果两个const同时用const int *const pp = #就是常量指针常量, 这名字真是超级难听.觉得还是叫指向常量的常量指针好点.

引用是特殊的指针常量

说了上面两个概念就很容易理解引用了.

引用实际上就是个指针常量(constant poniter).只不过是个特殊的指针常量.首先使用时语法就不一样

int num = 22;

int & rNum = num; //如果是const int num;那么引用就是const int& rNum = num;

另外就是引用时指向的对象必须是胡有效存在的,不能指向空的引用.除此之外和指针常量没啥区别了.一个样.据说用反编译看汇编代码,引用的最终实现就跟指针一样的.不过我还真没去验证过.

由于编译器做了特殊处理,引用就直接用名字,不用前面再加个星星*去解引用.这样用起来方便多了.所以凡是用到指针常量的地方都差不多可以用引用来代替了.

分享到:
评论

相关推荐

    C++对象和指针的引用

    this指针是一个隐含于每一个成员函数中的特殊指针。它是一个指向正在被该成员函数操作的对象,也就是要操作该成员函数的对象。 当对一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,然后调用成员...

    值类型和引用类型的区别

    上面这段代码,我们首先创建了一个Person类,包含了Name和Age两个属性,毋庸置疑,Person类是引 用类型,Name也是,因为它是string类型的(但string是很特殊的引用类型,后面将专门有一篇文章来讨论),但Age则是值...

    C/C++ 数组和指针及引用的区别

    但是,指针是一个变量,里面存储的内容是另外一个变量的地址,因为是变量所以指针有自己的内存空间,只不过里面存储的内容比较特殊。 (2)区别 a.对于声明和定义,指针和数组是不相同的,定义为数组,则声明也...

    继续公开引用模块指定子程序源码

    同时一些特殊代码(如使用汇编实现的 取This指针)不允许存在中间子程序。使用方法:。假设需要继续公开的来自模块的名称为“Test”的子程序(以下将这个模块称作提供者)。在引用这个模块的模块(以下称作引用者)...

    java用JNA调用dll实例,包含各种参数调用

    实例中演示了各种参数形式的DLL函数调用,如:基本数据类型、基本数据类型的指针和引用、结构体、结构体的指针和引用、函数指针和回调函数、字符串指针、输入数组、输出数组等,非常实用。

    详解C++中指针和引用的区别

    (1)指针是存放内存地址的一种变量,特殊的地方就在它存放的是内存地址。因此,指针的大小不会像其他变量一样变化,只跟当前平台相关——不同平台内存地址的范围是不一样的,32位平台下,内存最大为4GB,因此只需要...

    c/c++ 学习总结 初学者必备

    c) 一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to a pointer to an integer) d) 一个有10个整型数的数组(An array of 10 integers) e) 一个有10个指针的数组,该指针是指向一个整型数的...

    零起点学通C++多媒体范例教学代码

    9.3.5 到底是使用引用还是指针 9.3.6 引用和指针可以一块用 9.4 引用应注意的问题 9.4.1 引用容易犯的错误 9.4.2 引用一个按值返回的堆中对象 9.4 -3引用一个按别名返回的堆中对象 9.4.4 在哪里创建,就在哪里释放 ...

    零起点学通C++学习_多媒体范例教学代码

    9.3.5 到底是使用引用还是指针 9.3.6 引用和指针可以一块用 9.4 引用应注意的问题 9.4.1 引用容易犯的错误 9.4.2 引用一个按值返回的堆中对象 9.4 -3引用一个按别名返回的堆中对象 9.4.4 在哪里创建,就在哪里...

    《垃圾收集》(Garbage Collection)扫描版[PDF]——part2

    10.6.8 一个简单的引用计数指针 10.6.9 用于灵活的垃圾收集的智能指针 10.6.10 用于追踪式垃圾收集的智能指针 10.7 为支持垃圾收集而修改C++ 10.8 Ellis和Detlefs的建议 10.9 终结机制 10.10 需要考虑的问题 10.11 ...

    (Garbage Collection)扫描版——part1

    10.6.8 一个简单的引用计数指针 10.6.9 用于灵活的垃圾收集的智能指针 10.6.10 用于追踪式垃圾收集的智能指针 10.7 为支持垃圾收集而修改C++ 10.8 Ellis和Detlefs的建议 10.9 终结机制 10.10 需要考虑的问题 10.11 ...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    10.3.2 通过指针引用数组元素 143 10.3.3 数组名作函数参数 146 10.3.4 指向多维数组的指针和指针变量 148 10.4 字符串的指针指向字符串的针指变量 150 10.4.1 字符串的表示形式 152 10.4.2 使用字符串指针变量与...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar )

    10.3.2 通过指针引用数组元素 143 10.3.3 数组名作函数参数 146 10.3.4 指向多维数组的指针和指针变量 148 10.4 字符串的指针指向字符串的针指变量 150 10.4.1 字符串的表示形式 152 10.4.2 使用字符串指针变量与...

    MySQL 主键与索引的联系与区别分析

    索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。下面是主键和索引的一些区别与联系。 1. 主键一定是唯一性索引,唯一性索引并不一定就是主键。 所谓...

    游戏画面就弹出内存不能为read修复工具

    解决方法:这是对方利用QQ的BUG,发送特殊的代码,做QQ出错,只要打上补丁或升级到最新版本,就没事了。 该内存不能为read或written的解决方案关键词: 该内存不能为"read" 该内存不能为"written" 从网上搜索来的...

    51单片机开发指导3

    第三大部分讨论了C语言程序设计问题。C语言程序设计步骤与汇编语言基本相同。C51程序主要由函数构成,其中...除了一般的指针,还提供了存储器指针等。在此部分还给出了C51编程的部分技巧。最后列举了C51相关的库函数。

    易语言-继续公开引用模块指定子程序

    会影响效率同时一些特殊代码(如使用汇编实现的 取This指针)不允许存在中间子程序使用方法:假设需要继续公开的来自模块的名称为“Test”的子程序(以下将这个模块称作提供者)在引用这个模块的模块(以下称作引用...

    java内存分配详解

    组或者对象之后,还可以在栈中定义一个特殊的变量,让栈中的这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个 变量就成了数组或对象的引用变量,以后就可以在程序中使用栈中的引用变量来访问堆中的数组...

Global site tag (gtag.js) - Google Analytics