[英]Passing array as an argument: C and 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.