指针 v.s. 引用
对C++的指针总觉得和引用差不多,其实还是挺有差别的。
程序
先看一个小程序:
int a = ;
int& ra = a;
int* pa = &ra; printf("&a = %02X\n", &a); //3EFCD0<<
printf("a = %d\n", a); //
printf("&ra = %02X\n", &ra); //3EFCD0<<
printf("ra = %d\n", ra); //
printf("&pa = %02X\n", &pa); //3EFCB8
printf("pa = %02X\n", pa); //3EFCD0<<
printf("*pa = %d\n", *pa); //
内存示意图

编译器的规则
计算机里面是一个城市,
城市里面有很多间房子,每个房子都有编号,每个房子里面会放具体的材料。
城市里面还有一个派出所,派出所里面有很多小盒子,每个小盒子都有编号,盒子里面放的就是城市里面的门牌号码。
程序员可以给房子盒子取名字,然后通过名字来得到他们。
房子:引用;盒子:指针;名字:变量名;门牌号,盒子编号:地址。
&得到门牌号或者盒子编号,*去到盒子里面找到门牌号,找到对应房子里面的东西。
程序编译成下面的故事
===注册===
程序员:这里有一个材料(1),帮忙找个房子放一下,
城市管理机构:找到一个门牌号(3EFCD0)的空房子,就用这个房子吧
程序员:好的,以后我就叫这个房子a吧
程序员:一个名字a还不够,我还想给他取个名字叫做ra,留着备用
程序员:申请一个派出所的盒子,
城市管理机构:找到一个编号为(3EFCB8)的空盒子,就用这盒子吧
程序员:好的,以后我就叫这个盒子pa吧
程序员:这个盒子里面放进刚才那个房子ra门牌号吧。(当然也可以告诉他们用a门牌号)
===使用===
程序员:告诉我房子a的编号
程序员:告诉我房子a里面装了什么
程序员:告诉我房子ra的编号
程序员:告诉我房子ra里面装了什么
程序员:告诉我盒子pa的编号
程序员:告诉我盒子pa里面装了什么(当然是那个门牌号)
程序员:告诉我盒子pa里面装门牌号码对应房子里面装了什么。
这样看来指针(盒子)和引用(房子)还是有挺大差别的吧。
潜规则:
让人讨厌的就是这些潜规则 -___-||,但是记住会更加安全。
- 房子申请了必须放东西(引用必须初始化),否则城市管理机构不干(编译不过),所以永远不会存在空引用(对于C#er而言很难理解,C#的引用鉴于C++指针和引用之间),这样省去了null check,更加高效。
int & ra; //error C2530: “ra”: 必须初始化引用
- 盒子申请可以不放东西(盒子不值钱,编译没有问题),但是要小心,在使用盒子前要自己先把门牌号放进去(运行时有问题),否则就要看城市管理机构心情,他们不会帮你清理盒子。
int * pa;//运行时,使用没有初始化的pa,会有这样的异常:读取位置 0xCCCCCCCC 时发生访问冲突。
Q&A
Q: int a;可以吗?
A: 编译没有问题,但是和指针一样的问题,这个时候房子申请到了, 你不放材料进去,不知道城市管理机构会放什么东西进去。所以总结而言:你申请东西的时候(房子或者盒子)的时候,最好初始化它,或者不要太久以后再去初始化,没有坏处的,兄弟。
Q: 房子一旦申请就不能改变(引用不能改变),盒子却可以改变里面放在房子门牌号,怎么理解?
A: 其实房子和盒子没有本质的区别(怎么又绕回来了@_@),因为他们都是一种东西,当你关注房子的时候,房子和盒子不一样:房子不能变,盒子却很灵活;但是如果你站在房子角度看房子,站在盒子的角度看盒子,是一样的,盒子一旦申请盒子编号也是不能再改变了,盒子只能是那个盒子。换种说法吧,有些时候你可以吧盒子的编号放在另外的盒子里面,被放进去的盒子就是和房子一样的地位了。(指针的指针,忽然觉得还有好长的路...)
Q:下面输出是多少
int a = ;
int& ra = a;
a = ; printf("ra = %d\n", ra);
A: "ra = 2"//因为ra和a就是同一个房子的两个名字。
指针 v.s. 引用的更多相关文章
- 【转载】C++ 值传递、指针传递、引用传递详解
原文链接:http://www.cnblogs.com/yanlingyin/ 值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值.从被调用函数的角度来说,值传递是单向的(实参->形 ...
- c++,基类声明的指针变量和引用类型变量可以指向派 生类的对象
基类声明的指针变量和引用类型变量可以指向派生类的对象,而反过来派生类的指针却不能指向基类变量. 这与基类和派生类之间,被允许的赋值方向是相反的. 但是从逻辑上很容易推敲其合理性.
- C++中值传递、指针传递、引用传递的总结
C++中值传递.指针传递.引用传递的总结 指针传递和引用传递一般适用于:函数内部修改参数并且希望改动影响调用者.对比值传递,指针/引用传递可以将改变由形参"传给"实参(实际上就 ...
- c/c++ 数组 数组的引用,指针数组的引用
c/c++ 数组 知识点 1,数组的声明和初始化,对应代码里的test1和test2 2,char数组,对应代码里的test3 3,数组不可以拷贝和复制,对应代码里的test4 4,指针数组, 数组的 ...
- C++ 值传递、指针传递、引用传递详解
C++ 值传递.指针传递.引用传递详解 最近写了几篇深层次讨论数组和指针的文章,其中提到了“C语言中,所有非数组的形式参数传递均以值传递形式” 数组和指针背后——内存角度 语义"陷阱&quo ...
- Perl 引用:引用就是指针,Perl 引用是一个标量类型可以指向变量、数组、哈希表(也叫关联数组)甚至子程序。
Perl 引用引用就是指针,Perl 引用是一个标量类型可以指向变量.数组.哈希表(也叫关联数组)甚至子程序,可以应用在程序的任何地方. 1.创建引用1.使用斜线\定义变量的时候,在变量名前面加个\, ...
- C++指针传递和引用传递的区别 (转载整理)
区别1:指针传递和引用传递是以不同的方式实现相同的效果,但是指针传递的本质还是值传递,只是传递的值是地址. 就拿 交换两个数的函数来举例: // 指针传递 void swap(int * val1, ...
- 【转】C++ 值传递、指针传递、引用传递详解
而关于值传递,指针传递,引用传递这几个方面还会存在误区, 所有我觉的有必要在这里也说明一下~ 下文会通过例子详细说明哦 值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值.从被调用函数的角 ...
- c++值传递,指针传递,引用传递以及指针与引用的区别
值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值.从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入, 不能传出.当函数内部需要修改参数,并且不希望这个改变影 ...
随机推荐
- ECSTORE 关于前台页面DIALOG的调用
在需调用dialog的html页面中插入本段代码. link='<{link app=test ctl=site_test act=abc}>'; var dialog = new Dia ...
- regular expression (php函数)
1. 正则表达式是一种字符串搜索和匹配的工具 2. php中常用正则表达式函数 preg_match($pattern, $subject) preg_match_all($pattern, $sub ...
- twsited(4)--不同模块用redis共享以及用web发送数据到tcpserver
上一章开头我们说,要连接之前flask系列文章中的用户,结果篇幅不够,没有实现. 今天我们把它实现一下.话说,不同模块之间,该如何联系在一起,通常都是mysql.redis.rabbitmq还有RPC ...
- 仿QQ5.0以上新版本侧滑效果
1.此效果使用了csdn大神孙国威的代码案例在此感谢附上参考博客地址: http://blog.csdn.net/manoel/article/details/39013095/#plain 2.sl ...
- 设定PCB电路板形状和物理边界
1 设定PCB电路板形状和物理边界 在Protel DXP的PCB板文件向导中,我们已经初步确定了电路板的形状和物理边界.但我们在绘制PCB板之前,也许还会对电路板的边界的细节加以调整.如果我们要对电 ...
- Ubuntu下Qt-4.7.1的静态编译
最近在学习Qt的静态编译,相比较来说windows的Qt静态编译比较容易,相反对于linux编译网上的文章实践下来都有这样那样的错误,这里简要小结一下自己的编译成果. 一.实验环境 1.Ubuntu ...
- COJ 0358 xjr考考你数据结构(根号3)线段树区间修改
xjr考考你数据结构(根号3) 难度级别:C: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 请你编写一个数据结构,完成以下功能: 1)求出第 ...
- BZOJ3538: [Usaco2014 Open]Dueling GPS
3538: [Usaco2014 Open]Dueling GPS Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 59 Solved: 36[Subm ...
- 2015第29周五AOP
AOP使用场景 AOP用来封装横切关注点,具体可以在下面的场景中使用: Authentication 权限 Caching 缓存 Context passing 内容传递 Error handling ...
- HDU5107---K-short Problem (线段树区间 合并、第k大)
题意:二维平面上 N 个高度为 Hi 建筑物,M次询问,每次询问输出 位于坐标(x ,y)左下角(也就是xi <= x && yi <= y)的建筑物中的第k高的建筑物的高 ...