很多人把指针和引用看成两个完全不同的东西,引用只是个别名,不占用实际内存,只不过操作起来有点像指针.实际上引用就是一个指针,只不过是个特殊的指针,编译器对它做了些特殊的处理.它也占用内存.但由于编译器做了特殊处理,你不能用&去取址,用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;
另外就是引用时指向的对象必须是胡有效存在的,不能指向空的引用.除此之外和指针常量没啥区别了.一个样.据说用反编译看汇编代码,引用的最终实现就跟指针一样的.不过我还真没去验证过.
由于编译器做了特殊处理,引用就直接用名字,不用前面再加个星星*去解引用.这样用起来方便多了.所以凡是用到指针常量的地方都差不多可以用引用来代替了.
分享到:
相关推荐
this指针是一个隐含于每一个成员函数中的特殊指针。它是一个指向正在被该成员函数操作的对象,也就是要操作该成员函数的对象。 当对一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,然后调用成员...
上面这段代码,我们首先创建了一个Person类,包含了Name和Age两个属性,毋庸置疑,Person类是引 用类型,Name也是,因为它是string类型的(但string是很特殊的引用类型,后面将专门有一篇文章来讨论),但Age则是值...
但是,指针是一个变量,里面存储的内容是另外一个变量的地址,因为是变量所以指针有自己的内存空间,只不过里面存储的内容比较特殊。 (2)区别 a.对于声明和定义,指针和数组是不相同的,定义为数组,则声明也...
同时一些特殊代码(如使用汇编实现的 取This指针)不允许存在中间子程序。使用方法:。假设需要继续公开的来自模块的名称为“Test”的子程序(以下将这个模块称作提供者)。在引用这个模块的模块(以下称作引用者)...
实例中演示了各种参数形式的DLL函数调用,如:基本数据类型、基本数据类型的指针和引用、结构体、结构体的指针和引用、函数指针和回调函数、字符串指针、输入数组、输出数组等,非常实用。
(1)指针是存放内存地址的一种变量,特殊的地方就在它存放的是内存地址。因此,指针的大小不会像其他变量一样变化,只跟当前平台相关——不同平台内存地址的范围是不一样的,32位平台下,内存最大为4GB,因此只需要...
c) 一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to a pointer to an integer) d) 一个有10个整型数的数组(An array of 10 integers) e) 一个有10个指针的数组,该指针是指向一个整型数的...
9.3.5 到底是使用引用还是指针 9.3.6 引用和指针可以一块用 9.4 引用应注意的问题 9.4.1 引用容易犯的错误 9.4.2 引用一个按值返回的堆中对象 9.4 -3引用一个按别名返回的堆中对象 9.4.4 在哪里创建,就在哪里释放 ...
9.3.5 到底是使用引用还是指针 9.3.6 引用和指针可以一块用 9.4 引用应注意的问题 9.4.1 引用容易犯的错误 9.4.2 引用一个按值返回的堆中对象 9.4 -3引用一个按别名返回的堆中对象 9.4.4 在哪里创建,就在哪里...
10.6.8 一个简单的引用计数指针 10.6.9 用于灵活的垃圾收集的智能指针 10.6.10 用于追踪式垃圾收集的智能指针 10.7 为支持垃圾收集而修改C++ 10.8 Ellis和Detlefs的建议 10.9 终结机制 10.10 需要考虑的问题 10.11 ...
10.6.8 一个简单的引用计数指针 10.6.9 用于灵活的垃圾收集的智能指针 10.6.10 用于追踪式垃圾收集的智能指针 10.7 为支持垃圾收集而修改C++ 10.8 Ellis和Detlefs的建议 10.9 终结机制 10.10 需要考虑的问题 10.11 ...
10.3.2 通过指针引用数组元素 143 10.3.3 数组名作函数参数 146 10.3.4 指向多维数组的指针和指针变量 148 10.4 字符串的指针指向字符串的针指变量 150 10.4.1 字符串的表示形式 152 10.4.2 使用字符串指针变量与...
10.3.2 通过指针引用数组元素 143 10.3.3 数组名作函数参数 146 10.3.4 指向多维数组的指针和指针变量 148 10.4 字符串的指针指向字符串的针指变量 150 10.4.1 字符串的表示形式 152 10.4.2 使用字符串指针变量与...
索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。下面是主键和索引的一些区别与联系。 1. 主键一定是唯一性索引,唯一性索引并不一定就是主键。 所谓...
解决方法:这是对方利用QQ的BUG,发送特殊的代码,做QQ出错,只要打上补丁或升级到最新版本,就没事了。 该内存不能为read或written的解决方案关键词: 该内存不能为"read" 该内存不能为"written" 从网上搜索来的...
第三大部分讨论了C语言程序设计问题。C语言程序设计步骤与汇编语言基本相同。C51程序主要由函数构成,其中...除了一般的指针,还提供了存储器指针等。在此部分还给出了C51编程的部分技巧。最后列举了C51相关的库函数。
会影响效率同时一些特殊代码(如使用汇编实现的 取This指针)不允许存在中间子程序使用方法:假设需要继续公开的来自模块的名称为“Test”的子程序(以下将这个模块称作提供者)在引用这个模块的模块(以下称作引用...
组或者对象之后,还可以在栈中定义一个特殊的变量,让栈中的这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个 变量就成了数组或对象的引用变量,以后就可以在程序中使用栈中的引用变量来访问堆中的数组...