• C++学习基础二——指针与引用的区别


    一、指针:

    (1)如果对指针进行解引用操作 赋值,改变的是指针所指向对象的值;
    (2)如果不对指针进行解引用操作 赋值,则改变的是指针本身的值;
    (3)指向const对象的指针:也叫指针常量,表示指针所指向的对象是const类型的,不允许通过解引用修改其所指向的值。如代码片段2所示。

    需要注意的是:指向const对象的指针不能通过解引用修改其所指向的对象的值不能用const类型的地址初始化普通的,非const类型的指针可以使用非const的地址初始化const类型的指针可以用const类型的地址初始化const void *指针,而不能初始化void *指针

      (4)const指针:表示声明的指针是const类型的,不允许修改指针的值,但可以通过解引用修改指针所指向对象的值。跟const变量类似,const指针必须在声明的时候初始化。

    例如:

    代码片段1:

    string s1("some value");
    string *sp1 = &s1;//此时s1的值为“some value”,指针sp1指向s1
    
    string s2("another");
    string *sp2 = &s2;//此时s2的值为"another",指针sp2指向s2
    
    *sp1 = "a new value";//此时s1的值为"a new value",指针sp1指向s1
    sp1 = sp2;//此时指针sp1指向s2
    

    代码片段2:

     1 const int *cptr;
     2 *cptr = 20;//error,不允许通过解引用修改指针所指向的对象的值
     3 
     4 const double dv = 20;
     5 double *dptr = &dv;//error,不能使用const类型的地址赋给非const类型的指针
     6 
     7 double dv2 = 30;
     8 const double *dptr2 = &dv2;//非const类型的地址可以赋给const类型的指针
     9 
    10 const int intValue = 42;
    11 void *vptr = &intValue;//error
    12 const void *vptr2 = & intValue;//ok
    13
    14 const int *iptr;
    15 int const *iptr2;// 14行和15行声明的指针是等价的,表示指针所指向的对象是const的,不能通过解引用修改,但指针本身的值是可以修改的
    16 int *const *iptr3;//表示iptr3是const指针,指针的值不允许修改,但是可以通过解引用修改指针所指向对象的值

    二、引用:

      (1)定义引用时必须初始化。

      (2)引用一经初始化,就始终指向特定的对象,如果给引用赋值,则修改的是引用所关联对象的值。

      (3):非const类型的引用只能用该引用同类型的对象初始化,不能使用右值

      (4):const类型的引用既可以使用右值初始化,也可以使用不同但相关类型的对象初始化

      (5):const类型的引用一经初始化完成就不能修改引用的值

    代码片段3:

    int i1 = 1000,i2 = 2000;
    int *s1 = &i1, *s2 = &i2;
    s1 = s2;
    
    结果:s1所指向的i1的值不变,赋值操作结束后,只是改变了指针s1本身的值,即s1指针指向另一个不同的对象。
    

     代码片段4:

    int &s1 = i1, &s2 = i2;
    s1 = s2;
    
    结果:赋值操作修改了s1所关联对象i1的值,而不是引用本身的值。赋值结束后,引用s1和引用s2还是分别指向原来对象,只是此时两个对象的值相等。
    

     代码片段5:

     1     int v1 = 10;
     2     int &rv1 = v1;
     3 
     4     rv1 = 12;
     5     cout<<"rv1 = "<<rv1<<"  v1 = "<<v1<<endl;//rv1 = 12  v1 = 12
     6 
     7     //int &rv2 = 10;//error,不能直接使用右值初始化引用
     8     double dValue = 10.0;
     9 
    10     //int &rv3 = dValue;//error,只能用与引用同类型的对象初始化引用
    11 
    12     const int &rv4 = dValue;//ok
    13 
    14     const int &rv5 = 10;//ok

     给出比较全的代码:

    #include <iostream>
    using namespace std;
    
    int main(){
    	
    	float s1 = 100,s2 = 200;
    	cout<<"原始两个值: "<<s1 << " "<<s2<<endl;
    
    	float *sp1 = &s1, *sp2 = &s2;
    	cout<<"第一次操作后的两个值: "<<s1 << " "<<s2<<endl;
    	cout<<"两个指针的值 sp1 = "<<*sp1<<"  sp2 = "<<*sp2<<endl;
    	cout<<"-----------------------------"<<endl;
    
    	//对指针进行解引用,改变了指针所指对象s1的值,由100变为10,对应上面指针理论(1)
    	*sp1 = 10;
    	cout<<"第二次操作后的两个值: "<<s1 << " "<<s2<<endl;
    	cout<<"两个指针的值 sp1 = "<<*sp1<<"  sp2 = "<<*sp2<<endl;
    	cout<<"-----------------------------"<<endl;
    
    
    	//不改变指针所指对象s1的值,改变了指针本身的值,此时指针sp1指向sp2,对应上面指针理论(2)
    	sp1 = sp2;
    	cout<<"第二次操作后的两个值: "<<s1 << " "<<s2<<endl;
    	cout<<"两个指针的值 sp1 = "<<*sp1<<"  sp2 = "<<*sp2<<endl;
    	cout<<"-----------------------------"<<endl;
    
    	//此时改变指针对象s2的值,同时指针sp2的值也改变
    	*sp1 = 15;
    	cout<<"第三次操作后的两个值: "<<s1 << " "<<s2<<endl;
    	cout<<"两个指针的值 sp1 = "<<*sp1<<"  sp2 = "<<*sp2<<endl;
    	cout<<"-----------------------------"<<endl;
    	cout<<""<<endl;
    
    	float &i1 = s1, &i2 = s2;
    	cout<<"第四次操作后的两个值: "<<s1 << " "<<s2<<endl;
    	cout<<"两个引用的值 s1 = "<<s1<<"  s2 = "<<s2<<endl;
    	cout<<"-----------------------------"<<endl;
    
    	//对引用赋值改变的是引用所关联对象的值
    	i1 = 30;
    	cout<<"第四次操作后的两个值: "<<s1 << " "<<s2<<endl;
    	cout<<"两个引用的值 s1 = "<<s1<<"  s2 = "<<s2<<endl;
    	cout<<"-----------------------------"<<endl;
    
    	//此时只是改变了i1引用所关联对象s1的值,只是引用i1和i2还是分别指向各自的对象,只是各自对象的值相等。
    	i1 = i2;
    	cout<<"第五次操作后的两个值: "<<s1 << " "<<s2<<endl;
    	cout<<"两个引用的值 s1 = "<<s1<<"  s2 = "<<s2<<endl;
    	cout<<"-----------------------------"<<endl;
    
    	return 0;
    }
    

     后续更新中......

  • 相关阅读:
    三分 例题
    设计模式学习笔记(十九):迭代器模式
    设计模式学习笔记(十八):解释器模式
    设计模式学习笔记(十七):命令模式
    设计模式学习笔记(十六):职责链模式
    设计模式学习笔记(十五):代理模式
    设计模式学习笔记(十四):享元模式
    设计模式学习笔记(十三):外观模式
    设计模式学习笔记(十二):装饰模式
    设计模式学习笔记(十一):组合模式
  • 原文地址:https://www.cnblogs.com/calence/p/5677513.html
Copyright © 2020-2023  润新知