数组、指针、引用小结

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

    先从它们的值说起,一个有效的指针值通常具有三种面孔:

    一是保存一个特定对象的地址,而且一般是用取地址符号“&”把该特定对象的地址拿出来赋给指针;

    二是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]);

   引用必须在声明时进行初始化,这点与指针有所不同,通过传递引用可以提高程序的运行速度。

    一般何时使用引用参数呢:

    1、数据很小时,按值传递。

    2、数据为数组,使用指针。

    3、数据为结构,使用指针或者引用。

    4、数据为类对象,使用引用。

   


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值