作者loveme00835 (朴髮箍)
看板C_and_CPP
標題Re: [問題] 關於傳陣列到函式的問題
時間Tue Apr 26 14:36:40 2011
※ 引述《icetofux ()》之銘言:
: 開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
: GCC
: 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
: N
: 問題(Question):
: 從資料上來看,如果傳陣列到其他函式中,傳的應該是陣列的起始位址,我進行了
傳的是陣列裡第0個元素的位址
: 下面的測試,結果與預期的有所出入,想請問是不是我的觀念錯了?
: 餵入的資料(Input):
: N
: 預期的正確結果(Expected Output):
: 下列的兩個cout結果相同
: 錯誤結果(Wrong Output):
: 1.Array Addr in main: 0x22ff60
: 2.Array Addr in Func: 0x22ff20
: 程式碼(Code):(請善用置底文網頁, 記得排版)
: 因為很短就直接po了:
: void Func(char Array[])
: {
: cout<<"2.Array Addr in Func:"<<hex<<&Array<<endl;
&Array 的型態為 char**
: }
: int main()
: {
: char Array[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
: cout<<"1.Array Addr in main:"<<hex<<&Array<<endl;
&Array 的型態為 char (*)[10]
: Func(Array);
: return 0;
: }
不同型態的物件, 值跑出來有差不用太意外.
: 補充說明(Supplement):
這邊需要清楚 void Func(char Array[])是什麼東西, 以下提供測
試碼:
void Func(
char Array[] );
void Func2(
char *Array );
assert(
typeid(Func) ==
typeid(Func2) );
std::cout <<
typeid(Func).name() << std::endl;
輸出如下(依編譯器有所不同):
FvPcE
涵義為
Function which returns
Void, and receives a
Pointer
to
Char as argument... (最後一個E不明)
所以既然它們是一樣的, 我通常會建議學弟改用第二種寫法以免把
它當作陣列來用, 出現 sizeof(Array)等之類的寫法, 換一下你就
會知道在 Func 裡印的實際上是區域物件 Array的位址.
真的要用也是可以啦, 不過你就要使用 by reference的方式傳遞
陣列:
typedef char CharArray10[ 10 ];
void Func( CharArray10
const &Array )
{
cout << "2.Array Addr in Func:"
<< hex << &Array <<endl;
}
main 的地方都不用改你就能得到一樣的結果.
--
▂▅▂ ▁ ● ◣ 朴 ☆ 素 ★ 妍 ◢
◢ ◣ ◢▂▂◣ ◢▂※◣ ◢▄▂◣ T.T.L Listen 2
★ ★ ★ ★ ▉ ★ ★▏▉ ★ ★◣ http://ppt.cc/jIUk
◥ˇ◢ ▃◥ˇ◤▃ ◥ˇ◤ ◥ˇ◤◢ 說什麼結束
▃▃▇▃▃ ◢▇◣ ▋
▎ ▋¥▎ ◢ http://ppt.cc/zQtB
▼ ▼ ▼ ▼ ψ髮箍 ◤ ◣
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.121.197.115
推 tomap41017:老師好(誤!) 04/26 16:10
改一下好了, 避免誤會.. 冏rz
推 icetofux:謝謝老師,其實關於指標我總是能避就避,這次剛好寫的 04/26 17:21
→ icetofux:很注重效能才去用的xd 04/26 17:21
用指標不一定會讓你的效能增加~
→ james732:用C與C++是避不掉指標的啊...XD 04/26 17:22
推 xatier:指標就是C強大之所在阿!! 04/26 17:55
→ dos792:有什麼理由不用c++ vector/string 嗎? 04/26 19:35
愈是強大的東西, 愈是難駕馭阿! :(
※ 編輯: loveme00835 來自: 140.121.197.115 (04/26 20:10)