引用只是对象的另一个名字,通过在变量名前面添加"&”符号来定义,而指针保存的是另一个对象的地址,它们两都提供了间接访问所服务变量的途径。

但是它们的差别还是挺大的:

先从它们的值说起,一个有效的指针值通常具有三种面孔,一是保存一个特定对象的地址,而且一般是用取地址符号“&”把该特定对象的地址拿出来赋

给指针;二是0值,此时表明它不指向任何对象,尽管任一个int型变量的值可能为0,但是直接把int型变量赋给指针是非法的,不过,如果是在编译时可以

获得0值的const变量则指针对它网开一面,也就是说,int s=0;int *p=s 是不行的,但是 const int s=0;int *p=s 或者直接int *p=0 都是可以的;三

是未初始化的指针,此时是无效的,直到它被赋值时才被可以使用。相对于指针,引用则显得苛刻但是专情,引用一经定义就必须用与该类型同类型的对象

初始化,就连同类型的具体值也不接受,如 int s=1024;int &t=s 是可以,但是int &s=10 或者 直接不初始化 int &s;都是不行的,这是它的苛刻之处。

不过它的专情就在于,当引用初始化后,只要它还存在,它就保持绑定到初始化时指定的对象,不接受绑定到它身上的其他对象。

其次,在赋值行为上也是反映不同:给引用赋值修改的是该引用所关联的对象的值,而给指针赋值是使指针指向另一个对象如:
   int i=100,t=200;
   int *p1=&i,*p2=&t;
   p1=p2;//p1所指向的i对象值保持不变,赋值操作改变了p1指针的值,使其指向另外一个不同的对象
   int &r1=i,&r2=t;
   r1=r2;//这个操作修改了r1引用的值i对象,而非引用本身,赋值后,这两个引用还是分别指向原来关联的对象,此时这两个对象的值相等。

在与const的结合上,所谓的const引用是指向const对象的引用,因此毫无疑问,如果要赋值给引用的对象本身是const,那么引用就得是const,即如

下:
  const int val=100;
   const int &val2=val;//注意:如果对象是const,那么引用就得是const
  此时,我们可以读取但不能修改val2,任何对val2的赋值都是不合法的,我们可以这样理解,既然已经规定我们不能对val赋值从而修改它的值,那么修改

它的间接途径即使用val2引用也得禁止.不过,相对于非const引用,const引用相对放得开,那就是cosnt引用可以初始化为不同类型的对象或者初始化为

右值,即如下可行:
  double dval=3.00;
  const int &ri=dval;

const int &intVal=43;

指向const对象的指针 :const double *pointer;,这里的pointer是一个指向double类型的const对象的指针,const限定了pointer指针所指向的对象

的类型,而非pointer指针本身,因此,我们可以给pointer重新赋值,使其指向另外一个对象,但是我们不能通过pointer修改其所指向的对象。C++强制

要求指向const对象的的指针也必须具有const特性。因此,如下会报错:
  const double p1=2.33;
  double *ptr=&p1;
   但允许把非const对象的地址赋值给指向const对象的指针,此时,我们同样不能使用该指针来修改该非const对象,但是我们可以使用其他方法来修改其

使指向对象的值。
   const指针:int *const ptr=&intVal;指针本身的值不能修改,所以,但是此时指针所指向的对象的值可否被修改,则取决于该对象的类型,如果,此时

的对象刚好也是const,那就对象值也不能被改,此时 const double *const ptr=doubleVal 叫做指向const对象的const指针。

好了,接下来,聊聊指针与数组的关系了!

C++语言中,指针与数组的关系密切。其一,如果在表达式中使用数组名,那么该名字会自动转换为指向数组第一个元素的指针:
   int a[]={2,3,5,6,9};
   int *p=a;//此时 p指向a[0]
  如果想让指针指向数组中的另外一个元素,那么我们可以使用下标操作符给该元素定位,然后用取地址操作符&获取该元素的存储地址:
  p=&a[4];
  指针还可以进行算术操作,int *p2=p+3;则p2将指向数组a中的a[3]
  其二,当我们传数组实参给数组形参时,实际上数组在传入时只传入指向其首元素的指针,不仅如此,数组形参的的数组边界也会被忽略了,即使我们在函数

定义的时候为数组形参指定的边界,即
  void fun(int ary[12]) 在数组实参传入时,跟void fun(int ary[])是一样的
  当然,如果希望函数只接受含有特定数量的元素的数组,那么,使用引用数组形参可以做到,即void fun(int (&ary)[12]);

C++之指针,引用与数组的更多相关文章

  1. C语言学习笔记 (007) - 数组指针和通过指针引用数组元素的方法总结

    1.数组指针:即指向数组的指针 那么, 如何声明一个数组指针呢? ]; /*括号是必须写的,不然就是指针数组:10是数组的大小*/ 拓展:有指针类型元素的数组称为指针数组. 2.通过指针引用数组元素的 ...

  2. 引用、数组引用与指针引用、内联函数inline、四种类型转换运算符

    一.引用 (1).引用是给一个变量起别名 定义引用的一般格式:类型  &引用名 = 变量名: 例如:int a=1;  int  &b=a;// b是a的别名,因此a和b是同一个单元 ...

  3. c语言——数组指针和通过指针引用数组元素的方法总结

    1.数组指针:即指向数组的指针 那么, 如何声明一个数组指针呢?int (* p)[10]; /*括号是必须写的,不然就是指针数组:10是数组的大小*/1拓展:有指针类型元素的数组称为指针数组. 2. ...

  4. paip.指针 引用 c++ java的使用总结.

    paip.指针 引用  c++ java的使用总结. ///////////////一般一个变量包括下面的信息 a.地址(指针)  b.命名(引用,别名)   c.变量内容.. 指针是一个变量的地址, ...

  5. C++笔记-数组指针/二维数组转换指针

    参考资料: 1. 作者 BensonLaur  :https://www.cnblogs.com/BensonLaur/p/6367077.html 2. https://blog.csdn.net/ ...

  6. C语言 指针基础篇 数组,函数与指针的运用 2 14

    下面看看如何在函数中运用指针吧 下面是往函数传入指针的简单操作,不是传入数组的.判断一个a是否大于b是的话给,是的话对其进行操作,不是的话就直接返回. #include <stdio.h> ...

  7. C和C指针小记(十三)-数组

    1.1 一维数组 一维数组的声明: int a[10]; 这里a就是一个数组. 数组a的类型就是一个指向整型的常量指针. 但是数组和指针是**不相同**的. **数组具有特定数量的元素,而指针只是一个 ...

  8. C语言指针系列 - 一级指针.一维数组,二级指针,二维数组,指针数组,数组指针,函数指针,指针函数

    1. 数组名 C语言中的数组名是一个特殊的存在, 从本质上来讲, 数组名是一个地址, 我们可以打印一个指针的值,和打印一个数组的值来观察出这个本质: int nArray[10] ={ 0 }; in ...

  9. perl 引用(数组和hash引用) --- perlreftut - Mark 的一个简单的'引用'教程 ---Understand References Today. --Mark Jason Dominus, Plover Systems (mjd-perl-ref+@plover.com)

    https://blog.csdn.net/fangwei1235/article/details/8570886 首页 博客 学院 下载 论坛 APP 问答 商城 活动 VIP会员 招聘 ITeye ...

  10. C++入门经典-例6.9-通过指针变量获取数组中的元素

    1:通过指针引用数组,需要先声明一个数组,再声明一个指针. int a[10]; int *p; 然后通过&运算符获取数组中元素的地址,再将地址值赋给指针变量. p=&a[0]; 代码 ...

随机推荐

  1. Winform程序部署方式总结一——ClickOnce发布

    针对Winform程序,介绍两种常用打包方式:ClickOnce和Windows Installer 应用程序如下: 一.ClickOnce发布 1.找到需要发布的项目文件,右击,从弹出的快捷菜单中找 ...

  2. f-measure[转]

    F-Measure又称为F-Score,是IP(信息检索)领域常用的一个评价标准,计算公式为: 其中β是参数,P是准确率(Precision),R是召回率(Recall). F1-Measure:当参 ...

  3. openstack之keystone部署

    前言 openstack更新频率是挺快的,每六个月更新一次(命名是是以A-Z的方式,Austin,Bexar...Newton).博主建议大家先可一种版本研究,等某一版本研究透彻了,在去研究新的版本. ...

  4. 【题解】HNOI2014世界树

    脑子不清醒的时候千万别写题.写题写不下去了千万别死扛,重构才是你唯一的出路QAQ 昨天很想快点写道题,思路没有很清晰的时候就写了,结果……今天一怒之下决定重整思路重构代码,其实不过是半个小时的事情…… ...

  5. CF#67 75d Big Maximum Sum

    ~~~题面~~~ 题解: 观察到拼接后的数据范围过大,无法O(n)解决,但是大区间是由很多小区间组成,而小区间是固定的,不会变化,所以可以考虑预处理出每个小区间的信息,然后根据给定序列按顺序一步一步合 ...

  6. ContestHunter暑假欢乐赛 SRM 04

    逃了一场SRM(躺 A题可以看成0点到1点,有p的几率从0到1,1-p几率不动,求0到1的期望步数.很显然概率是不降序列数/n!,然后列个方程E[0] = E[0] * (1 - p) + 1,解得E ...

  7. bzoj1483: [HNOI2009]梦幻布丁(链表+启发式合并)

    题目大意:一个序列,两种操作. ①把其中的一种数修改成另一种数 ②询问有多少段不同的数如1 2 2 1为3段(1 / 2 2 / 1). 昨晚的BC的C题和这题很类似,于是现学现写居然过了十分开心. ...

  8. JQuery仿淘宝滚动加载图片

    用 JQuery 制作随着显示页面的滚动条的滚动动态加载图片,适用于图片太多的页面,在访问网页时,可以先只加载第一屏要显示的图片,当用户进行向下滚动查看页面的时候,动态去加载这些图片,好处是减少页面第 ...

  9. sql 中sum函数返回null的解决方案

    SUM 是SQL语句中的标准求和函数,如果没有符合条件的记录,那么SUM函数会返回NULL. 但多数情况下,我们希望如果没有符合条件记录的情况下,我们希望它返回0,而不是NULL,那么我们可以使用例如 ...

  10. Java中的字符串常量池?

    参考:http://droidyue.com/blog/2014/12/21/string-literal-pool-in-java/index.html