à ờm bổ sung thêm có thể truyền con trỏ 2 cấp hay n cấp trong Java bằng cách tạo 1 wrapper class bọc quanh con trỏ n-1 cấp đó =]] ví dụ
static class PointerToInt {
int value;
PointerToInt(int n) {
this.value = n;
}
void deref_assign(int n) {
this.value = n;
}
int deref() {
return this.value;
}
}
public static void swap(PointerToInt a, PointerToInt b) {
int temp = a.deref();
a.deref_assign(b.deref());
b.deref_assign(temp);
}
public static void main(String args[]) {
PointerToInt a = new PointerToInt(11);
PointerToInt b = new PointerToInt(22);
System.out.println(a.deref()); // 11
System.out.println(b.deref()); // 22
swap(a, b);
System.out.println(a.deref()); // 22
System.out.println(b.deref()); // 11
}
ko truyền int*
được thì tạo 1 wrapper class có cho phép dereference như *p
và deref rồi gán như *p = ...
là xong
Java có class Integer
cũng là wrapper của int
nhưng ko chó phép deref giá trị bên dưới vì nhiều lý do :V 1 trong các lý do đó có lẽ là optimization, ví dụ small int như 0-255 thì Java nó tạo 256 object sẵn, mỗi lần tạo Integer.valueOf(n)
nếu n
nhỏ nó chỉ việc ref tới object 1 sẵn có là xong ko cần cấp phát gì hết :V n
lớn thì mới cấp phát động. Nhưng optimize kiểu vậy mà cho deref integer value bên dưới thì Integer(1) có thể bị sửa thành 11, thành ra gọi Integer.valueOf(1)
mà nó in ra 11 thì chết nên ko cho deref :V
thử đổi int value
thành int[] value
xem có “swap” được ko :V
được nè mà phải sử dụng đúng :V
static class PointerToIntArray {
int[] value;
PointerToIntArray(int[] arr) {
this.value = arr;
}
void deref_assign(int[] newValue) {
this.value = newValue;
}
int[] deref() {
return this.value;
}
}
public static void swap(PointerToIntArray a, PointerToIntArray b) {
int[] temp = a.deref();
a.deref_assign(b.deref());
b.deref_assign(temp);
}
public static void main(String args[]) {
PointerToIntArray a = new PointerToIntArray(new int[3]);
a.deref()[0] = 10;
a.deref()[1] = 20;
a.deref()[2] = 30;
PointerToIntArray b = new PointerToIntArray(new int[3]);
b.deref()[0] = 11;
b.deref()[1] = 22;
b.deref()[2] = 33;
System.out.println(Arrays.toString(a.deref())); // [10, 20, 30]
System.out.println(Arrays.toString(b.deref())); // [11, 22, 33]
swap(a, b);
System.out.println(Arrays.toString(a.deref())); // [11, 22, 33]
System.out.println(Arrays.toString(b.deref())); // [10, 20, 30]
}
nếu tạo a = new PointerToIntArray(A)
với int[] A = {10, 20, 30};
ở ngoài thì swap
vẫn ko thay đổi được giá trị của A
, vì a.value
chỉ là 1 con trỏ khác cùng trỏ tới mảng mà A
trỏ tới. Nếu a.value
thay đổi thì A
vẫn ko bị thay đổi :V