作者walm20 (New CygnusX)
看板C_and_CPP
標題Re: [問題] 雙重指標
時間Thu Feb 19 11:53:44 2009
課本範例:
For call by addr.
void f(int *a)
{
*a=10;
}
void main()
{
int b=5;
f(&b); //把b記憶體位址,傳入f
}
不能拿以下例子去判斷變數傳遞方式是不是call by addr. or value吧?
void f(int *a)
{
a=new int (10);
}
void main()
{
int b=5;
f(&b);
}
存取的變數根本就不一樣了 (上面是存取addr point到的變數,下面是存取pointer)
--
我的露天拍賣:
http://tinyurl.com/6z4rw7
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.118.126.177
※ 編輯: walm20 來自: 140.118.126.177 (02/19 11:54)
※ 編輯: walm20 來自: 140.118.126.177 (02/19 11:58)
1F:→ windincloud:我覺得你第二個例子這樣兩者都不算才對~ 02/19 13:15
2F:→ windincloud:call by val. addr.應該是要成立在傳入副函式且不改其 02/19 13:16
3F:→ windincloud:值的使用, 你這樣寫 反而是新開空間給a了~ b有傳沒傳 02/19 13:17
4F:→ windincloud:都一樣~ :p 02/19 13:17
5F:→ walm20:你這樣講 是假設你在main裡面想改的是b的值 02/19 13:28
6F:→ walm20:若我想改b的位址 那就是call by value 02/19 13:28
※ 編輯: walm20 來自: 140.118.126.177 (02/19 13:30)
7F:推 VictorTom:Call by xxx是看參數的傳遞方式, 不是看參數怎麼做存取. 02/19 14:00
8F:→ VictorTom:而且您的第二個例子只會造成mem leak沒有其他作用@_@" 02/19 14:02
9F:→ VictorTom:它不會改變b, 也跟參數call by xxx沒什麼直接的關係. 02/19 14:03
10F:→ walm20:我以為大家焦點只會在call by xxx,所以就不寫delete 02/19 14:09
11F:→ VictorTom:重點不是delete, 而是第二個例子變成和b完全沒有關係. 02/19 14:11
12F:→ walm20:那您的意思應該是說 市面上有寫到call by addr的書是錯的 02/19 14:11
13F:→ walm20:應該改為call by value摟? 02/19 14:11
14F:→ VictorTom:傳了b的address進來沒有使用, 這沒解釋param passing @@ 02/19 14:12
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
我是覺得這句話跟以下例子矛盾 (即CBV)
void f(int a)
{
a=10;
}
void main()
{
int b=5;
f(a);
}
個人淺見 :p
15F:→ VictorTom:很吊詭的是CbA這種講法我現在看到兩種對立的解釋.... 02/19 14:13
16F:→ VictorTom:一種是C語言老式的"pass the address by value"的作法 02/19 14:14
17F:→ VictorTom:一種就是說Call by Reference是Call by Address.... 02/19 14:15
18F:→ VictorTom:在原文的資料裡目前小弟找不到具體講Call by Address的. 02/19 14:15
19F:→ VictorTom:所以個人覺得搞清楚CbV, CbR, 而by Address盡量不要講. 02/19 14:15
20F:→ VictorTom:或者如果板上有先進有更明確的資料能提供的願聞其詳:) 02/19 14:16
※ 編輯: walm20 來自: 140.118.126.177 (02/19 14:23)
※ 編輯: walm20 來自: 140.118.126.177 (02/19 14:25)