一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - java及C++中傳值傳遞、引用傳遞和指針方式的理解

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

2019-11-29 16:05hebedich JAVA教程

為什么 Java 只有值傳遞,但 C++ 既有值傳遞,又有引用傳遞呢?今天我們就來探討下這個問題,有需要的朋友可以參考下

java的值傳遞理解:

代碼1:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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:

原始狀態

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

代碼1圖解:

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

代碼2理解:

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

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

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

這就是Java的值傳遞。

C++中兩種傳遞的區別:

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#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;
}

第一個是值傳遞,第二個函數是引用傳遞,但是后面兩種,同一個函數,一次調用是Call by reference, 一次是Call by value。

因為:

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

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

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

?
1
ByValue(&v);  //error

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

 

總結:

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

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

這樣的話:

C/C++:默認傳值,引用傳引用,指針單獨理解(指針可以理解為既可以傳值、也可以傳引用,而產生結果相同)

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

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

JAVA和C#的string要特殊理解,表象是傳值,實際要看虛擬機實現

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 草莓丝瓜芭乐樱桃榴莲色多黄 | 男人午夜禁片在线观看 | 四虎影视在线看免费 720p | 男生同性啪视频在线观看 | 国产里番 | 香蕉免费一区二区三区 | 香蕉eeww99国产精选播放 | 色五夜婷婷 | 丝瓜香蕉视频 | 99视频福利| 乌克兰肥熟 | 午夜亚洲一区二区福利 | 亚洲欧美久久一区二区 | 午夜日本大胆裸艺术 | 久久水蜜桃亚洲AV无码精品偷窥 | 日本aaaa级| 天天爱天天做天天爽天天躁 | 91精品国产91久久久久久麻豆 | 禁忌高h| 韩国一区二区三区 | free性俄罗斯护士 | 久久99re2在线视频精品 | 波多野结衣在线免费观看 | 国产日韩高清一区二区三区 | 国产精品主播在线 | 高清视频在线播放ww | 国产日韩片 | 国内精品视频一区二区三区八戒 | 古代翁熄乩伦小说h | 久久成人永久免费播放 | 日韩欧免费一区二区三区 | 波多野结衣xxxx性精品 | 久久一er精这里有精品 | 日本五级床片全都免费播放 | 日本免费看 | 欧产日产国产精品专区 | 9久re热视频这里只有精品 | 欧美乱理伦另类视频 | 日韩视频在线观看中字 | 日韩成人在线视频 | 亚洲欧美日韩在线观看看另类 |