其他分享
首页 > 其他分享> > 引用和指针

引用和指针

作者:互联网

                             引用和指针

对于指针和引用我们先来分析一下他们的相同点和不同点:

相同点:

1. 都是地址的概念;

指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名。我们可以从反汇编下看出来。

可以看到,在汇编上,引用就是指针操作,定义一个引用变量,相当于就是定义了一个指针,然后把引用内存的地址写到这个指针里面,当通过引用变量修改它所引用的内存时(b = 20),从汇编上可以看到,它先访问了指针里面的地址,然后在这个地址的内存里面把值 改为 20。

不同点:

    1. 指针是一个实体,而引用仅是一个别名;

    2. 引用使用时无需解引用(*),指针需要解引用;

    3. 引用只能在定义时被初始化一次,之后不可变;指针可变;

    4. 引用没有 const,指针有 const,const 的指针不可变;

    5. 引用不能为空,指针可以为空。

    6. “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的           大 小;

    7. 指针和引用的自增(++)运算意义不一样;

 

下面我们就用举例子的方式,使得我们更加理解上诉的不同点。

  1. 我们可以看如下的代码:
  1. int i = 5;  
  2. int j = 6;  
  3. int &k = i;  
  4. k = j; // k 和i 的值都变成了6;  

我们可以分析一下,如上的代码,引用就是取别名的意思,这里面就相当于k就是i的别名,就比如说你叫“小明”,现在给你一个别名“xiaoming”,这时候,我不管是叫“小明”还是叫“xiaoming”,都是在叫同一个人。就如上面的代码,最后k和i的值都会变成6.

   2.对于引用,必须是要初始化的,并且不能指向空,引用一经定义不能改变。

  1. int *p = 0;  
  2. int &q = *p;  
  3. q = 10;  
  4. printf("%d", *p);  
  5. return 0;  

对于如上的代码,我们使我们的引用指向了一个空值,这样也是错的,我们的引用一定不能指向空。

这时候我们在一些方面上,引用的效率会比指针的效率高。

  1. void printDouble(const double& rd)  
  2. {  
  3.  cout<< rd; // 不需要测试rd,它  
  4. }       // 肯定指向一个double值  
  5.   
  6. //指针则应该总是被测试,防止其为空:  
  7. void printDouble(const double *pd)  
  8. {  
  9.  if (pd)  
  10.  {// 检查是否为NULL  
  11.   cout<< *pd;  
  12.  }  
  13. }  

当我们的引用初始化之后,引用就不能改变。

  1. trings1("Nancy");  
  2. strings2("Clancy");  
  3.  string& rs = s1; // rs 引用 s1  
  4. string *ps= &s1; // ps 指向 s1  
  5. rs = s2; // rs 仍旧引用s1  
  6.        // 但是s1的值现在是"Clancy"  
  7.  ps = &s2; // ps 现在指向 s2;// s1 没有改变  

    3.对于引用使用最常见的地方在于函数的参数传递。

  1. void Func2(int *x)  
  2. {  
  3.     (* x) = (* x) + 10;  
  4. }  
  5. int n = 0;  
  6. Func2(&n);  
  7. cout << “n = ” << n << endl; // n = 10  

 

  1. void Func3(int &x)  
  2. {  
  3.     x = x + 10;  
  4. }   
  5. int n = 0;  
  6. Func3(n);  
  7. cout << “n = ” << n << endl; // n = 10  

      以上就是引用和指针的两种参数传递,找了一篇博客,然后给了如下的内容进行参考。

丿灬慕容笑笑 发布了46 篇原创文章 · 获赞 67 · 访问量 1万+ 私信 关注

标签:函数,int,s1,主调,引用,指针
来源: https://blog.csdn.net/weixin_42078660/article/details/104608650