关于C++引用做为函数参数和指针作为函数参数

关于C++引用做为函数参数和指针作为函数参数

个人感觉引用和指针有着很多相识的地方
参考
http://blog.itpub.net/7728585/viewspace-2113049/
我们这里编写两段函数如下:
1、
  AT_NAME & at_r (AT_NAME & cp,const AT_NAME & in_s)
  {
      cp = in_s;
      return cp;
  }
2、 
  AT_NAME* at_p (AT_NAME *cp , const AT_NAME* in_s)
  {
      *cp = *in_s;
      return cp;
  }                 

第一段完全使用C++引用而后一段完全使用指针,实际上引用和指针都是指向同一个变量的或者说
一段内存。
比如 AT_NAME & cp,const AT_NAME & in_s 实际上不是值的复制而更像是传的地址,返回的的引用
当然也相当于原地址。和指针基本相同。
完整程序如下:
  1 /*************************************************************************
  2     > File Name: yinyong.cpp
  3     > Author: gaopeng
  4     > Mail: gaopp_200217@163.com
  5     > Created Time: Wed 01 Jun 2016 06:09:47 PM CST
  6  ************************************************************************/
  7
  8 #include<iostream>
  9 #include <stdio.h>
 10 using namespace std;
 11
 12
 13 typedef struct att_name
 14 {
 15     char name[10];
 16     unsigned int ages;
 17     unsigned int height;
 18 } AT_NAME;
 19
 20 AT_NAME & at_r (AT_NAME & cp,const AT_NAME & in_s);
 21 AT_NAME* at_p (AT_NAME *cp , const AT_NAME* in_s);
 22
 23 int main(void)
 24 {
 25     AT_NAME a1 = {"颜蕾",28,120};
 26     AT_NAME a2 = {"高鹏",30,170};
 27     AT_NAME a3 = {"高子涵",4,30};
 28
 29     AT_NAME cp1;
 30     AT_NAME cp2;
 31     AT_NAME cp3;
 32     AT_NAME cp4;
 33
 34     at_r( cp1 , a1 );
 35     at_p( &cp2 , &a2 );
 36
 37     at_r(cp3 , a1 ) = a3;
 38     *(at_p( &cp4 , &a2 )) = a3;
 39
 40     printf("%s ,%d ,%d\n",cp1.name,cp1.ages,cp1.height);
 41     printf("%s ,%d ,%d\n",cp2.name,cp2.ages,cp2.height);
 42     printf("%s ,%d ,%d\n",cp3.name,cp3.ages,cp3.height);
 43     printf("%s ,%d ,%d\n",cp4.name,cp4.ages,cp4.height);
 44 }
 45
 46
 47 AT_NAME & at_r (AT_NAME & cp,const AT_NAME & in_s)
 48 {
 49     cp = in_s;
 50     return cp;
 51 }
 52
 53 AT_NAME* at_p (AT_NAME *cp , const AT_NAME* in_s)
 54 {
 55     *cp = *in_s;
 56     return cp;
 57 }

这段程序有2个需要注意的地方
1、at_r(cp3 , a1 ) = a3
   *(at_p( &cp4 , &a2 )) = a3
   这两个方式都可以完成,为什么正确是因为他们都是一段有效结构体内存,然后他们和a3相等是可以完成的。
   完成这个步骤后cp3 = a3 ,cp4 = a3
2、函数都使用了return cp,返回引用或者指针
   比一般的方式比如:
   AT_NAME  at_p ( const AT_NAME* in_s)
   {
     AT_NAME temp;
     temp = *in_s;
     return temp;
   }
   int main(){
   ....
   cp3 = at_p( &a2);
   ....
   }
   比起这种方式直接返回引用或者指针,可以避免建立一个临时变量的内存,效率较高
   这里at_p( &a2)就会建立一个临时变量用于保存函数返回的结构体temp。
  
  
 

时间: 2024-10-27 20:51:58

关于C++引用做为函数参数和指针作为函数参数的相关文章

c++将引用或者是指针作为函数参数实现实参的运算_C 语言

C++增加引用类型, 主要是把它作为函数参数,以扩充函数传递数据的功能,较指针参数来得更加安全直观.将引用作为参数传递的时候,实参初始化形参的时候不分配内存空间,也不调用拷贝构造函数,因此更加能够提高运算的性能.所以我们应该尽可能地使用引用,而非指针,但是应该要注意,因为局部变量具有自己短暂的生命周期,因此不能够返回对一个局部变量的引用. 引用通常是在被定义的时候被初始化,但是当它作为参数的时候,则是在被调用的时候被初始化.这时候对引用所做的改变就是对被引用的变量所做的改变. 引用对变量的访问是

向函数中传递指针和传递指针的引用的区别

如果是传递指针,那么会先复制该指针,在函数内部使用的是复制后的指针,这个指针与原来的指针指向相同的地址,如果在函数内部将复制后的指针指向了另外的新的对象,那么不会影响原有的指针:但 是对于传递指针应用,如果将传递进来的指针指向了新的对象,那么原始的指针也就指向了新的对象,这样就会造成内存泄漏,因为原来指针指向的地方已经不能再 引用了,即使没有将传递进来的指针指向新的对象,而是在函数结束的时候释放了指针,那么在函数外部就不能再使用原有的指针了,因为原来的内存已经被释放了   看个例子: #incl

Lua中的函数(function)、可变参数、局部函数、尾递归优化等实例讲解_Lua

一.函数 在Lua中,函数是作为"第一类值"(First-Class Value),这表示函数可以存储在变量中,可以通过参数传递给其他函数,或者作为函数的返回值(类比C/C++中的函数指针),这种特性使Lua具有极大的灵活性.   Lua对函数式编程提供了良好的支持,可以支持嵌套函数.   另外,Lua既可以调用Lua编写的函数,还可以调用C语言编写的函数(Lua所有的标准库都是C语言写的).   定义一个函数 复制代码 代码如下: function hello() print('he

C++函数的传入参数是指针的指针(**)的详解

要修改变量的值,需要使用变量类型的指针作为参数或者变量的引用.如果变量是一般类型的变量,例如int,则需要使用int 类型的指针类型int *作为参数或者int的引用类型int&.但是如果变量类型是指针类型,例如char*,那么需要使用该类型的指针,即指向指针的指针类型 char* *,或者该类型的引用类型char*&.   首先要清楚  不管是指针还是值传入函数后都会创建一个副本,函数结束后值内容不能传出来是因为值的副本,而传入的值并没被修改,指针能传出来是因为我们修改的是指针指向的内容

Object-C中编写省略参数的多参函数

Object-C中编写省略参数的多参数函数 引语: 在Object-C中,我们会遇到很多像NSLog这样的函数,其中参数的个数不确定,由程序员自由控制,在初始化数组,字典等方面应用广泛,那么,这类的函数是如何实现的呢?我们怎么编写我们自己的省略参数的函数呢?当然,这不是唯一的多参函数的处理方法,你也可以通过一个字典或者数组传递参数.但C为我们提供的这样的一种机制,无疑是最方便的. 一.了解几个概念 va_list C语言中定义的一个指针,用于指向当前的参数. va_start(ap,param)

MWMCR::EvaluateFunction error ... 未定义与 &amp;amp;#x27;char&amp;amp;#x27; 类型的输入参数相对应的函数 &amp;amp;#x27;algorithm&amp;amp;#x27;。

问题描述 用C#调用MATLAB2014a编译的DLL,函数在MATLAB中是可以运行的,但是在C#中就总是报错"未定义与'char'类型的输入参数相对应的函数'algorithm',algorithm是我下载的spider工具箱里面的一个类,已经放到toolbox里了,matlab的路径也配置好了,已经弄了一星期了,还没解决,给位大侠,求指点啊! 解决方案 解决方案二:截图,代码解决方案三:这个是C#的代码下面是MATLAB里的代码明明有algorithm这个函数,为什么说没有定义呢?关键是f

特殊用途语言特性——默认参数、内联函数和constexptr函数

1 默认实参 某些函数有这样一些参数,在函数的很多次调用中它们都被赋予一个相同的值,此时,我们把这个反复出现的值称为函数的默认实参.调用含有默认实参的函数时,可以包含该实参,也可以省略该实参. 我们可以为一个或多个形参定义默认值,不过需要注意的是,一旦某个形参被赋予了默认值,它后面的所有形参都必须有默认值.   使用默认实参调用函数 如果我们想使用默认实参,只要在调用函数的时候省略该实参就可以了. 函数调用调用时实参按其位置解析,默认实参负责填补函数调用缺少的尾部实参(靠右侧位置). 当设计含有

Python中函数的参数传递与可变长参数介绍

  这篇文章主要介绍了Python中函数的参数传递与可变长参数介绍,本文分别给出多个代码实例来讲解多种多样的函数参数,需要的朋友可以参考下 1.Python中也有像C++一样的默认缺省函数 代码如下: def foo(text,num=0): print text,num foo("asd") #asd 0 foo("def",100) #def 100 定义有默认参数的函数时,这些默认值参数 位置必须都在非默认值参数后面. 调用时提供默认值参数值时,使用提供的值,

ActiveX如何调用引用该ActiveX的网页中的JavaScript函数

active|activex|javascript|函数|网页  前言 很多网友问到,在HTML的页面中放置一个COM对象,这个对象该如何调用页面中的脚本函数的问题,本人近日也因为工作需要实现这样的功能,在网上搜索后,获得了很多帮助,但并没有发现完整的实现.本文描述了实现过程中的几个要点,同时提供一个示例工程的下载. 1--给接口添加一个方法:方法名:SetClientSite参数:IOleClientSite* pClientSite 2--给上面的方法加以实现(在相应的类中实现,已经自动生成