程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java及C++中傳值傳遞、援用傳遞和指針方法的懂得

java及C++中傳值傳遞、援用傳遞和指針方法的懂得

編輯:關於JAVA

java及C++中傳值傳遞、援用傳遞和指針方法的懂得。本站提示廣大學習愛好者:(java及C++中傳值傳遞、援用傳遞和指針方法的懂得)文章只能為提供參考,不一定能成為您想要的結果。以下是java及C++中傳值傳遞、援用傳遞和指針方法的懂得正文


讓我們假定在文件夾中你有許多劇本文件(或圖片、日記等等),而且你想要將它們全體重定名。獲得的新文件名應當具有如一個前綴接一個數字。

這裡將告知你怎樣去完成。

例子將重定名你指定的文件夾內一切擴大名為.ps1的Powershell劇本。新的名字將成為powershellscriptX.ps1,這裡的“X”是一個遞增數字。

留意劇本默許還沒有真正開端重定名。請特殊當心要去失落它的-Whatif參數才真實的重定名文件。假定你錄入的變量或輸出了一個毛病的目次途徑,這時候你的劇本會毛病將數以千計的文件重定名,那可是你不想看到的。
$Path = 'c:\temp'
$Filter = '*.ps1'
$Prefix = 'powershellscript'
$Counter = 1

Get-ChildItem -Path $Path -Filter $Filter -Recurse |
  Rename-Item -NewName {
    $extension = [System.IO.Path]::GetExtension($_.Name)
    '{0}{1}.{2}' -f $Prefix, $script:Counter, $extension
    $script:Counter++
   } -WhatIf

心得:

罕見的字符串處置辦法,重點控制'{0}{1}.{2}' -f 用法。

文章起源:http://www.pstips.net/bulk-file-renaming.html

http://files.jb51.net/file_images/article/201409/201409221113463.jpg" width="400" height="288" alt="" />

代碼一中, copy的誰人援用, 指向了一個新的對象。 但原對象照樣沒有變更的。

代碼二中, copy的誰人援用, 把原對象轉變了。

這就是Java的值傳遞。

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

關於C++值傳遞、援用傳遞、指針方法用以下代碼懂得,本身運轉測試

#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類型,所以兩種表示,統一種成果。你能夠會想我如許

ByValue(&v);  //error

,而在C++中傳遞分歧類型的參數直接編譯欠亨過。


總結:

所以我認為傳值還傳援用先看內存上怎樣走就好了

share內存就是傳援用,copy內存就是傳值(先拋開一些特別情形)

如許的話:

C/C++:默許傳值,援用傳援用,指針零丁懂得(指針可以懂得為既可以傳值、也能夠傳援用,而發生成果雷同)

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

C#:值類型傳值,援用類型傳援用,ref/out特別懂得

JAVA和C#的string要特別懂得,表象是傳值,現實要看虛擬機完成


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved