Discussion:
[問題] 請問call by address
(时间太久无法回复)
just do it
2007-03-19 09:14:26 UTC
Permalink
請問參數若為arraylist或vector時
是傳address位址嗎?
乾瞎!

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.96.194.99
愚人
2007-03-19 09:43:21 UTC
Permalink
※ 引述《scdog (just do it)》之銘言:
: 請問參數若為arraylist或vector時
: 是傳address位址嗎?
: 乾瞎!

forever pass value

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 211.21.79.162
just do it
2007-03-19 15:44:27 UTC
Permalink
※ 引述《qrtt1 (愚人)》之銘言:
: ※ 引述《scdog (just do it)》之銘言:
: : 請問參數若為arraylist或vector時
: : 是傳address位址嗎?
: : 乾瞎!
: forever pass value

不好意思我今天寫了一個小程式發現似乎是call by address

public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList b = new ArrayList();
b.add("3");
test c = new test(b);

for(int i=0; i < b.size(); i++)
System.out.println(b.get(i));
}

public test(ArrayList a){

a.add("1");
a.add("2");
}

print出來後結果是3 1 2
這樣應該沒錯吧



--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.175.234.91
小安
2007-03-19 15:51:28 UTC
Permalink
※ 引述《scdog (just do it)》之銘言:
: 不好意思我今天寫了一個小程式發現似乎是call by address

1. 在 Java 中是使用 reference 取代 address,
因此 Java 中並沒有所謂的 address

2. 這些看似 call by address 的效果,
其實是透過 "對 reference type 做 call by value" 達成

3. 以這個角度來看的話,就連 C/C++ 也沒有所謂的 call by address

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.131.70.198
Alien
2007-03-20 07:52:15 UTC
Permalink
※ 引述《tkcn (小安)》之銘言:
: ※ 引述《scdog (just do it)》之銘言:
: : 不好意思我今天寫了一個小程式發現似乎是call by address
: 1. 在 Java 中是使用 reference 取代 address,
: 因此 Java 中並沒有所謂的 address
: 2. 這些看似 call by address 的效果,
: 其實是透過 "對 reference type 做 call by value" 達成
: 3. 以這個角度來看的話,就連 C/C++ 也沒有所謂的 call by address
^^^

foo(int& myInt) {
myInt = 1;
}

main() {
int i = 0;
foo(i);
cout << i << endl;
}

Alien

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 202.22.246.26
Alien
2007-03-20 08:18:19 UTC
Permalink
※ 引述《tkcn (小安)》之銘言:
: [lacal]
: ※ 引述《adrianshum (Alien)》之銘言:
: : ^^^
: : foo(int& myInt) {
: : myInt = 1;
: : }
: : main() {
: : int i = 0;
: : foo(i);
: : cout << i << endl;
: : }
: : Alien
: 嗯? 難到這不是 call by reference 嗎 @_@?
搞昏了... call-by-address 其實是什麼?
(其實我腦中只有 call-by-value, reference 和 name XDDDDD)


Alien

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 202.22.246.26
小安
2007-03-20 09:12:27 UTC
Permalink
下面是 C# 的程式碼,
---
static void callByAddr(ref string param) {
Console.WriteLine("before change: " + param);
param = "abc";
Console.WriteLine("after change: " + param);
}

static void Main(string[] args) {
string str = "123";

Console.WriteLine("before call: " + str);
callByAddr(ref str);
Console.WriteLine("after call: " + str);
}
---

output:
---
before call: 123
before change: 123
after change: abc
after call: abc
---

str 是我要傳遞的參數,

因為使用了 ref 修飾,因此傳遞的內容是 str 的 address。


所以當我 assign 其他的值給 param,同時也會影響 str,

因為 str 與 param 其所 bind 的記憶體位址相同。




補充一點個人淺見,

坊間一些 C/C++ 書籍會將 foo( &obj ) 認定為 call by address,

我想這是因為真正要傳遞的參數是 obj (我並非指實作面)

而傳遞 address 只是一種為了達到 side-effect 手段,

因此其實我認為,稱呼這種情況為 call by address 其實也未嘗不可。

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.131.70.198
godfat 真常
2007-03-20 12:12:38 UTC
Permalink
根據 wikipedia,
http://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_reference

..總覺得這頁長得好像跟以前不一樣?
我記得以前是說 call by address 是 call by reference 的另一種說法
也就是說,兩件事是指同一件事

現在看起來 call by address 又是 call by reference 的變形了

其實我只是想說,名詞不太重要,不是因為他真的不重要,
而是說法真的是太多種了|||b
所以呢,知道是什麼事情就好了… :(

以 Java 來說的話,variable 本身不能被 alias, 意思就是
每一個 call 都只能傳遞 variable 本身的複製。

以 C++ 來說的話,上面那件事跟把 pointer copy 傳過去是同一件事
然後額外還有個 call by reference 就是替 variable 做 alias...

Java:

void f(Object of){
of = null;
}
void g(){
Object og = new Object();
f(og);
out.println(og);
}

則 instance 只有一份,Object variable 有兩份,of 和 og 是不同的
對 of 操作不會影響到 og, 經過 f(og); 後 og 還是指向該 instance.
Java 永遠只有這種操作

C++:

void f(Object* of){
of = NULL;
}
void g(){
Object* og = new Object;
f(og);
cout << og << endl;
}

上面這段意思跟 Java 一樣,但另外還有:

void f(Object*& of){
of = NULL;
}

只在參數列那邊多加了個 &, 這樣就是 pointer reference,
of 和 og 可以視為同一個 pointer, 所以 f(og); 後,og 會變 NULL

還有很多其他的變形,例如:

void f(Object of);
void f(Object** of);
void f(Object**& of);
void f(Object************************************************** of);

在 Java 板就不說太多了 XD

--
In Lisp, you don't just write your program down toward the language,
you also build the language up toward your program.

《Programming Bottom-Up》- Paul Graham 1993

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.132.58.12
沒回應=掛站
2007-03-24 03:03:57 UTC
Permalink
這其實還是call by value
只是這個value的型態是reference(參考)而已 :)

變數b的type事實上應該看成 "reference to ArralyList"

█-->█████
b ArrayList

因此,你執行test c = new test(b)時
其實是複製了一份b到public test中,只是它也指向ArrayList

█-->█████
b ^
█-----|
a

這當然是pass by value
只是該value也指向ArrayList :)

關於java中reference的觀念,我在
http://sandwichc.blogspot.com/2007/03/reference-in-java-java.html
中提了一些
相信看完後應該能讓您更清楚一些 :)

※ 引述《scdog (just do it)》之銘言:
: ※ 引述《qrtt1 (愚人)》之銘言:
: : forever pass value
: 不好意思我今天寫了一個小程式發現似乎是call by address
: public static void main(String[] args) {
: // TODO Auto-generated method stub
: ArrayList b = new ArrayList();
: b.add("3");
: test c = new test(b);
: for(int i=0; i < b.size(); i++)
: System.out.println(b.get(i));
: }
: public test(ArrayList a){
: a.add("1");
: a.add("2");
: }
: print出來後結果是3 1 2
: 這樣應該沒錯吧

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.169.117.116

Loading...