最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java及C++中傳值傳遞、引用傳遞和指針方式的理解

 更新時間:2014年09月22日 11:23:07   投稿:hebedich  
為什么 Java 只有值傳遞,但 C++ 既有值傳遞,又有引用傳遞呢?今天我們就來探討下這個問題,有需要的朋友可以參考下

java的值傳遞理解:

代碼1:

public class Test {   
   
  /**   
   * @param args   
   */  
  public static void main(String[] args) {     
    StringBuffer buffer= new StringBuffer("colin");   
    SChange(buffer);   
    System.out.println( buffer);   
  }   
      
  public static void SChange (StringBuffer str) {   
    str= new StringBuffer("huang");   
  }   
   
}

代碼2:

public class Test {   
   
  /**   
   * @param args   
   */  
  public static void main(String[] args) {     
    StringBuffer buffer= new StringBuffer("colin");   
    SChange(buffer);   
    System.out.println( buffer);   
  }   
      
  public static void SChange (StringBuffer str) {   
    //str= new StringBuffer("huang");       str.append(" huang");   
  }   
   
}

再分別用兩張圖來解釋上面的代碼1、代碼2:

原始狀態(tài)

代碼1圖解:

代碼2理解:

代碼一中, copy的那個引用, 指向了一個新的對象。 但原對象還是沒有變化的。

代碼二中, copy的那個引用, 把原對象改變了。

這就是Java的值傳遞。

C++中兩種傳遞的區(qū)別:

對于C++值傳遞、引用傳遞、指針方式用如下代碼理解,自己運(yùn)行測試

#include <stdio.h> 
#include <iostream> 
#include <typeinfo> 
void ByValue(int a) 
{ 
  a = a + 1; 
} 
 void ByRef(int& a) 
{ 
  a = a + 1; 
} 
 void ByPointer(int* a) 
{ 
  *a = *a + 1; 
} 
 int main(int argv, char** args) 
{ 
  int v = 1; 
  ByValue(v); 
  ByRef(v); 
 
  // Pass by Reference   ByPointer(&v); 
 
  // Pass by Value   int* vp = &v; 
  ByPointer(vp); 
   
  std::cout << v << std::endl; // std::cout << typeid(vp).name() << std::endl;  
// std::cout << typeid(&vp).name() << std::endl;    std::cout << "end" << std::endl; 
}

第一個是值傳遞,第二個函數(shù)是引用傳遞,但是后面兩種,同一個函數(shù),一次調(diào)用是Call by reference, 一次是Call by value。

因為:

ByPointer(vp); 沒有改變vp,其實是無法改變。值傳遞

ByPointer(&v); 改變了v。引用傳遞(你可能會說,這傳遞的其實是v的地址,而ByPointer無法改變v的地址,所以這是Call by value。這聽上去可以自圓其說,但是v的地址,是個純數(shù)據(jù),在調(diào)用的方代碼中并不存在,對于調(diào)用者而言,只有v,而v的確被ByPointer函數(shù)改了,這個結(jié)果,正是Call by reference的行為。從行為考慮,才是求值策略的本意。如果把所有東西都抽象成值,從數(shù)據(jù)考慮問題,那根本就沒有必要引入求值策略的概念去混淆視聽。)

nob:以上理解認(rèn)可,補(bǔ)充指針方式可以使用兩種方式,值傳遞:傳遞一個指針;引用傳遞:傳遞一個變量的地址或者引用;如果使用typeid(x).name()查看&v和vp發(fā)現(xiàn)都是Point類型,所以兩種表現(xiàn),同一種結(jié)果。你可能會想我這樣

ByValue(&v);  //error

,而在C++中傳遞不同類型的參數(shù)直接編譯不通過。


總結(jié):

所以我覺得傳值還傳引用先看內(nèi)存上怎么走就行了

share內(nèi)存就是傳引用,copy內(nèi)存就是傳值(先拋開一些特殊情況)

這樣的話:

C/C++:默認(rèn)傳值,引用傳引用,指針單獨(dú)理解(指針可以理解為既可以傳值、也可以傳引用,而產(chǎn)生結(jié)果相同)

JAVA:基礎(chǔ)數(shù)據(jù)類型值傳遞,對象也是值傳遞(把這個對象的引用copy了一份)

C#:值類型傳值,引用類型傳引用,ref/out特殊理解

JAVA和C#的string要特殊理解,表象是傳值,實際要看虛擬機(jī)實現(xiàn)


相關(guān)文章

最新評論

玉田县| 吴川市| 定边县| 永州市| 花垣县| 修文县| 阿图什市| 股票| 西乌| 迁安市| 琼中| 探索| 房产| 马尔康县| 酒泉市| 秀山| 孝感市| 铜梁县| 简阳市| 南阳市| 神池县| 莎车县| 新蔡县| 邯郸县| 三明市| 枞阳县| 罗平县| 抚松县| 玛曲县| 涿鹿县| 石狮市| 泸溪县| 临武县| 巨鹿县| 武义县| 岚皋县| 龙胜| 塔河县| 郁南县| 冀州市| 滁州市|