c++ reference和pointer简单探讨

  1. 引用只是c++语法塘,可以看作编译器自动完成取地址、解引用的常量指针
  2. 引用区别于指针的特性都是编译器约束完成的,一旦编译成汇编就和指针一样
    由于引用只是指针包装了下,所以也存在风险,比如如下代码:
    int *a = new int;
    int &b = *a;
    delete a;
    b = 12;    // 对已经释放的内存解引用
     
  3. 引用由编译器保证初始化,使用起来较为方便(如不用检查空指针等)
     
  4. 尽量用引用代替指针
     
  5. 引用没有顶层 const (引用本身不可变) 即int & const,因为引用本身就不可变,所以在加顶层 const 也没有意义;但是可以有底层 const ()即 const int&,这表示引用所引用的对象本身是常量
  6. 指针既有顶层const(int * const--指针本身不可变),也有底层const(const int *--指针所指向的对象不可变)
     
  7. 有指针引用--是引用,绑定到指针, 但是没有引用指针--这很显然,因为很多时候指针存在的意义就是间接改变对象的值。但是引用本身的值我们上面说过了是所引用对象的地址,但是引用不能更改所引用的对象,也就当然不能有引用指针了。
     
  8. 指针和引用的自增(++)和自减含义不同,指针是指针运算, 而引用是代表所指向的对象对象执行++或--
    #include<iostream>
    using namespace std;
    int main()
    {
    	int x = 5;
    	
    	int& r = x;//reference必须在声明时就有初始化,否则Error
    			   //reference r可以说是 x的代表,也就是说字节和value都和x一模一样。
    			   //即使reference在本质上是使用pointer来实现的,当我们改变r的值时,x的值也会变化。 
    	int* p = &x;
    	int x2 = 23;
    	    r = x2; //cout:r:23,x:23,表明reference不再可以指向其他物体.可以说reference是一种代表. 
    	 //64位机器下: 
    	cout<<"size(x):"<<sizeof(x)<<" "<<"value:"<<x<<endl; //size(x):4 value:5 
    	 
    	cout<<"size(r):"<<sizeof(r)<<" "<<"value:"<<r<<endl; //size(r):4 value:5
    	 
    	cout<<"size(p):"<<sizeof(p)<<" "<<"value:"<<*p<<endl;//size(p):8 value:5
    	//address对比:三者地址一模一样的 ,但是reference本质上是一种漂亮的指针,只是被刻意设计成和它所代表的变量一模一样。 
    	cout<<"p的地址:"<<p<<endl; //p的地址:0x70fdf8
    
    	cout<<"r的地址:" <<&r<<endl;//r的地址:0x70fdf8
    	
    	cout<<"x的地址:"<<&x <<endl;//x的地址:0x70fdf8
    	 
    	cout<<"r="<<r<<" "<<"x="<<x<<endl;//r=23,x=23;
    	r--;
    	cout<<"r="<<r<<" "<<"x="<<x<<endl;//r=22,x=22;
    	return 0;
    } 

    总结:尽量用reference,特别是在传参的时候,传reference比较快。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值