ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

引用和指针

2020-03-02 12:05:42  阅读:240  来源: 互联网

标签:函数 int s1 主调 引用 指针


                             引用和指针

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

相同点:

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有