關於C++引用做為函式引數和指標作為函式引數

gaopengtttt發表於2016-06-06

關於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:
  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。
  
  
 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7728585/viewspace-2116526/,如需轉載,請註明出處,否則將追究法律責任。

相關文章