国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

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

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要特殊理解,表象是傳值,實際要看虛擬機實現

延伸 · 閱讀

精彩推薦
423
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 久久久av| 日韩毛片一区二区三区 | 亚洲精品一区二区 | 中文字幕自拍偷拍 | 国产精品伦理 | 在线观看毛片网站 | 国产一区二区精品在线观看 | 国产在线看片 | 欧美日韩高清不卡 | 国产毛片视频 | 亚洲国产高清高潮精品美女 | 久久精品二区 | 欧洲精品在线观看 | 毛片a片 | 欧美a级成人淫片免费看 | 亚洲欧美日韩精品久久亚洲区 | 成人精品视频免费在线观看 | 午夜私人影院 | 亚洲精品网址 | 日本在线观看网址 | 午夜电影一区 | 精品欧美乱码久久久久久1区2区 | 久久99精品国产麻豆宅宅 | 欧洲美女性开放视频 | 成人欧美一区二区三区视频xxx | 超碰c | 亚洲一区二区三区 | 亚洲欧美视频 | 成人午夜电影在线观看 | 国产一区二区精品在线观看 | 最新av在线 | 日本视频中文字幕 | 国产精品久久久久久久一区探花 | 一区二区三区视频在线观看 | 成人av视 | 国产福利在线视频 | 国产成人精品一区二区三区四区 | 91国内外精品自在线播放 | av一区二区三区四区 | 亚洲一区中文字幕在线观看 | 午夜激情视频在线观看 |