全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1681
推到 Plurk!
推到 Facebook!

函式參數陣列傳遞問題

尚未結案
syao
初階會員


發表:66
回覆:63
積分:25
註冊:2005-02-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-07-28 22:36:32 IP:59.104.xxx.xxx 未訂閱
    #include     using namespace std;    void cc(int (*name)[3]);     int main()
{
  int name[2][3]={{1,2,99},{3,4,77}};
          
    cout <<&name[0][0]<//陣列起始位址
    cc(name);        system("pause");
    return 0;    }
void cc(int (*name)[3])
{
    
     cout<<&(*name)[0]; //    (*name)[0] 不是個"陣列指標"嗎??     為什麼還需要加上 &(取址運算子) ;才能取到&name[0][0]相同位址     cout << (*name)[0]這樣為什麼不可以        
     
}    
1.還有函式傳遞陣列是靠指標來傳遞位址 , 位址是陣列的起始位址嗎??? 2.在main()內的cc(name); name陣列名稱是把它的位址傳遞給(*name)[3]陣列指標嗎??? & => *的意思嘛?? 3.還有請問陣列指標什麼情況下用到,除了傳遞多維陣列 & 函式指標 還有什麼情況下用到?? 下面另一個問題
#include 
#include 
#include     using namespace std;    void cc(char (*name)[10]);     int main()
{
  char *name[10]={"hello","world"}; //這邊把name[2][10]改成*name[10]這樣就不能編譯過去是什麼原因
    
    cc(name);
    
    system("pause");
    return 0;    }
void cc(char (*name)[10])
{
   
   cout << name[0];
     
}        
發表人 - syao 於 2005/07/28 23:00:25 發表人 - syao 於 2005/07/28 23:03:38
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-07-29 00:58:29 IP:211.76.xxx.xxx 未訂閱
syao 您好: 回答之前先做一下背景說明: 1)優先順序的說明:陣列索引[]優先於間接取值運算子'*'與取址運算子'&'。 2)&(變數):取得該變數在記憶體中的位址; *(位址):取得該位址所存放的資料 陣列元素的指定: 例如: int ary[10]; => ary[3] 全等於 *(ary 3),也就是說我們可以依個人喜好使用任一種寫法。 您的提問綜合回答如下: int (*name)[3]; => name是個指標(由定義 *name 知道,因為括號所以要整個來看), 指向的資料型態為 int [3],即含有三個元素的整數陣列。 所以,(*name),(即 *位址 形式)此刻就是含三個元素的整數陣列,也就是說整個表示一個陣列的起始位址。 因此(*name)[0]就如同上述ary[0]是一樣的意思,也就是所指陣列的第一個元素。 於是在該變數"(*name)[0]"之前加上取址運算子'&',便可以取得該變數的所在位址。 char *name[10]; => name是個含十個元素的陣列變數,其陣列成員的型態均為(char*)。 char name[2][10]; => name是個二維字元陣列,其大小為兩列,每列可以有十個元素。 關於函式指標的討論,請參考我之前的相關回覆,不好意思沒有整理存檔,一時間找不到! RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####
syao
初階會員


發表:66
回覆:63
積分:25
註冊:2005-02-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-07-29 01:51:50 IP:59.104.xxx.xxx 未訂閱
richtop非常感謝你的解答~~    下面我使用C的printf()使用C++ 的cout差別    
#include 
#include 
#include     using namespace std;    void cc(char(*p)[10]);
int main()
{       char name[2][10] = {"hello","world"};
   cc(name);        system("pause");
   return 0;    }    void cc(char(*p)[10])
{
     
   
   cout << p<    cout << *(p)<
發表人 - syao 於 2005/07/29 01:55:41 發表人 - syao 於 2005/07/29 01:56:57
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-07-29 11:25:15 IP:211.76.xxx.xxx 未訂閱
syao 您好: 在printf(.)中您明確得告訴程式要以何種方式來解讀資料,如:%p, %s; 但是在C 物件導向的程式裡提供了另一個一致方便的輸出入機制,cout, cin; 於是您可以不管或不明確指定資料型態是什麼的情形下,均能一致的輸出與輸入它們, 如:cout << data; or cin >> data; 所以較之C其實是方便且具延展性的(對於習慣操作細節的我,還是習慣用printf(),不過在此要特別聲明:這僅屬個人習慣)! cout會根據所給予資料的型態來決定相對的輸出方式。 因而您給了字元陣列位址p,自然被當成位址;如果您要把該位址的內容印出,就需要更明確的告知cout,是(*p)。 其實說起來還蠻合理的! 另外再把上次忘了回答的傳指標問題說一下: 在C/C 中,函式的參數是指標(位址)就是傳址呼叫。其目的在能將傳入參數進行修改並傳回修改後的結果。 另一種情況是:如果要傳陣列或者說是一大串相同型態資料時,也可以用該資料段的起始位址。 不過這連帶會發生一些風險,如果您只是要傳資料但不想被函式更改資料內容的話,可能會有誤改的情形出現; 一個解決辦法是在該參數變數前加上const,以避免函式中非預期的更改到資料! RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####
syao
初階會員


發表:66
回覆:63
積分:25
註冊:2005-02-02

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-07-29 15:09:56 IP:203.70.xxx.xxx 未訂閱
    #include     using namespace std;    int main()
{        char *name[2]={"hello","world"};
    
    cout <//這樣為什麼抓不到它的位址 顯示出來是 hello
            system("pause");
    return 0;    }           
發表人 - syao 於 2005/07/29 15:28:32
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-07-31 22:08:59 IP:211.76.xxx.xxx 未訂閱
syao 您好: 如您所試,只要给的是(char *)型態,就會被當成字串印出. 至於 cout 詳細的轉換規則,我無法得知! RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####
系統時間:2024-05-18 7:14:05
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!