簡體   English   中英

將數組作為參數傳遞:C和Java

[英]Passing array as an argument: C and Java

在提出問題之前,我會指出我知道:

  1. 在C語言中,我們可以通過值也可以通過引用來調用方法
  2. 在Java中,我們只能按值調用方法(當我們傳遞對象時,我們傳遞的是對象引用的值,而不是對象引用本身)
  3. 在C和Java上下文中,指針和引用之間存在區別。

現在問題來了:

考慮一個數組:

arr = {1,2,3,4,5} //len =5

在C中,我可以做以下兩件事:

foo(arr, len);
bar (arr+ 2, len -2);

函數定義:

foo(int *a, int l) {
  ...
  printf("%d", &a[0];  //prints 1
  ...
}

bar (int *a, int l){
  printf("%d", &a[0];  //prints 3
  ...
}

如我們所見,功能欄中的數組a以值3開頭,因為它包含arr [2](原始數組)的地址。 如果我們想將子數組視為起始索引為0的新數組,則這是在C中傳遞數組的一種巧妙方法。

我想知道,盡管以下調用在C和Java中具有不同的含義,但是在Java中是否可以實現相同的目的:

foo(arr);

是的,只需添加一個int off參數或使用IntBuffer類即可。

void foo(int[] a,int off, int l) {
 ...
 System.out.printf("%d", a[off];  //prints 1
 ...
 ...
}

f(a,2,l);


void foo(IntBuffer a,int l){
   System.out.printf("%d",a.get(0));
}
IntBuffer buffer = IntBuffer.wrap(a,2,a.length-2);
foo(buffer,l);

如果您的問題是關於是否可以通過像arr + 2這樣的指針算術來尋址數組的元素,那么答案是否定的。

但是,通過傳入數組和要開始讀取數組的位置,可以達到相同的效果。

java中數組的基礎結構在頭部有一個額外的元素,指示其長度。 因此,原始數組將是JVM存儲的{len, 1, 2, 3, 4, 5} 這樣做是為了防止Java在數組上執行“安全”的索引操作。 這也使得在Java中幾乎不可能進行指針算術運算。

要在Java中執行類似的操作,通常會使用某種Buffer類包裝數組。

Java缺乏本機切片功能(就像C中關於數組開始的隱式函數或幾種現代語言中的顯式函數),但是很容易構建自己的類,該類包裝數組,索引和長度你需要它。

當您使用C和Java傳遞數組時,想法是相同的。

在Java中,為對象傳遞的所有內容都是對其的引用,即指針。 在Java中,您永遠不會說:A * a = new A(); 您只需編寫A a = new A(); 缺少*是區別。 否則,A的行為完全類似於指針。

基本變量按值傳遞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM