線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1451
推到 Plurk!
推到 Facebook!

關於C語言陣列的問題!!

尚未結案
kenken
一般會員


發表:12
回覆:28
積分:8
註冊:2003-05-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-05-18 23:29:01 IP:203.203.xxx.xxx 未訂閱
就是啊,我做一個反轉一維矩陣內的值,在convert函式裡,就是a[i]=b[i]這一行,他已經把原本陣列a裡的東東給翻轉過來了,但在主程式裡最後一個print_matrix(data),當他在呼叫data時,怎麼不是原本的data,而是陣列a的值,那這樣的話,不就是違反了區域變數的規則了嗎?我太笨了,希望有人可以教教我!!謝謝大家的幫忙!!     #include  #define SIZE 10 void print_matrix(int a[]),convert(int a[]); int main(void) { int data[SIZE]={1,2,3,4,5,6,7,8,9,10}; printf("Before process...\n"); print_matrix(data); /* 印出轉換前陣列的內容 */ convert(data); /* 呼叫convert()函數 */ printf("After process...\n"); print_matrix(data); /* 印出轉換後陣列的內容 */ return 0; } void print_matrix(int b[]) /* 自訂函數print_matrix() */ { int i; for(i=0;i=0;i ,j--)/* 反轉矩陣內的值 */ b[j]=a[i]; for(i=0;i
tech_state
版主


發表:44
回覆:638
積分:641
註冊:2003-02-10

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-05-19 00:56:55 IP:203.204.xxx.xxx 未訂閱
引言: 就是啊,我做一個反轉一維矩陣內的值,在convert函式裡,就是a[i]=b[i]這一行,他已經把原本陣列a裡的東東給翻轉過來了,但在主程式裡最後一個print_matrix(data),當他在呼叫data時,怎麼不是原本的data,而是陣列a的值,那這樣的話,不就是違反了區域變數的規則了嗎?我太笨了,希望有人可以教教我!!謝謝大家的幫忙!! #include #define SIZE 10 void print_matrix(int a[]),convert(int a[]); int main(void) { int data[SIZE]={1,2,3,4,5,6,7,8,9,10}; printf("Before process...\n"); print_matrix(data); /* 印出轉換前陣列的內容 */ convert(data); /* 呼叫convert()函數 */ printf("After process...\n"); print_matrix(data); /* 印出轉換後陣列的內容 */ return 0; } void print_matrix(int b[]) /* 自訂函數print_matrix() */ { int i; for(i=0;i=0;i ,j--)/* 反轉矩陣內的值 */ b[j]=a[i]; for(i=0;i kenken, 您好 其實問題不是出在區域變數上, 您可以做做以下的實驗:
將 void print_matrix(int b[])
改為
void print_matrix(int c[]) 
 
我想您得到的結果會是一樣的。 至於為什麼最後一次的print_matrix(data)不是原來的data, 那是因為您已經做了convert, 而做完convert之後,data的值就等於convert中的a了, 所以您列印出來的值才會是a。 ======================= 涵養怒中氣。謹防順口言。留心忙裡錯。珍惜有時錢。 是非終日有,不聽自然無 天下本無事,庸人自擾之
kenken
一般會員


發表:12
回覆:28
積分:8
註冊:2003-05-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-05-19 16:53:30 IP:203.203.xxx.xxx 未訂閱
版主,先謝謝你一下! 所以就是把陣列當作引數時,並沒有區域和全域變數的問題,是這樣子的嗎? 再謝謝版主!!
tech_state
版主


發表:44
回覆:638
積分:641
註冊:2003-02-10

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-05-19 17:21:18 IP:61.221.xxx.xxx 未訂閱
引言: 版主,先謝謝你一下! 所以就是把陣列當作引數時,並沒有區域和全域變數的問題,是這樣子的嗎? 再謝謝版主!!
kenken, 您好 並不是這樣喔! 以下列了幾篇有關呼叫函式的資料供您參考。 http://imil.au.edu.tw/~hsichcl/TurboC/C_Unit7.htm http://www.takka.com.hk/intropg/pgch11/c11p4.htm http://www.takka.com.hk/intropg/pgch6/c6p1.htm ======================= 涵養怒中氣。謹防順口言。留心忙裡錯。珍惜有時錢。 是非終日有,不聽自然無 天下本無事,庸人自擾之 發表人 - tech_state 於 2003/05/19 17:23:59
kenken
一般會員


發表:12
回覆:28
積分:8
註冊:2003-05-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-05-19 18:31:33 IP:203.203.xxx.xxx 未訂閱
感謝版主的熱心回答!!有點概念了!
Royce520
高階會員


發表:18
回覆:157
積分:100
註冊:2002-09-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-05-19 18:43:44 IP:140.126.xxx.xxx 未訂閱
kenken 你好,   終於在你跟 tech_state 的討論中, 確知你的問題了 恩, > 我在簡單說明並舉例一下好了. 你所提出的問題 是程式語言中所謂 函數參數傳遞方式, 方法有四種(一般編譯程式的書都有), 我想這裡我把它分 為兩類來給你說明好了, 一種呢 不會更改原來的值, 一種 會變動到原來的資料... 舉例如下: (>*>&>不會把值回存到 > 恩 還得多看多想 ...所以請把 ><>*真實的事物最美, 簡單的道理最好, 我能體會的 太少*
------
不要忘記呼吸,不要忘記編程! ∩__∩
kenken
一般會員


發表:12
回覆:28
積分:8
註冊:2003-05-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-05-19 20:28:34 IP:203.203.xxx.xxx 未訂閱
感謝各位的熱心回答。 是不是當我們傳遞一般的變數名稱到函數時,接收的函數會將參數的內容給copy 一分,放在函數所使用的記憶体中,就像是函數裡的區域變數一樣,當函數結束 時,原先在其他區段裡的變數並不會更改其值! 而傳遞的引數是陣列時,由於陣列的長度可能很大,為了避免記憶体空間的不 足,所以當初在設計一C語言時,就泆定當陣列為引數時,就不用像一般的引數 一樣,將陣列copy一份,也就是說,當陣列為引數特,傳遞到函數中的是該陣列 實際的位址!! 不知這樣子說,對不對?? 感謝二位!!
Royce520
高階會員


發表:18
回覆:157
積分:100
註冊:2002-09-13

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-05-19 22:12:03 IP:211.75.xxx.xxx 未訂閱
KenKen 你好,   領悟力不錯喔 ... 好樣地 是地, 哪種不改變原來引數的函數呼叫方式, 稱為 > <><>*真實的事物最美, 簡單的道理最好, 我能體會的 太少*
------
不要忘記呼吸,不要忘記編程! ∩__∩
tech_state
版主


發表:44
回覆:638
積分:641
註冊:2003-02-10

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-05-19 22:25:44 IP:203.204.xxx.xxx 未訂閱
看來還是Royce520前輩比較厲害, 我的表達能力與文筆皆不好, 所以只能找找資料看看是否能幫幫kenken, 現在再加上Royce520前輩的解說, 相信對kenken的幫助更大了, kenken的領悟力也很好,加油喔! 如果完全了解後,也可以用您的想法將資料整理一份, 與大家分享您的學習心得, 以方便有需要的會員朋友查詢。 ======================= <>涵養怒中氣。謹防順口言。留心忙裡錯。珍惜有時錢。 <>是非終日有,不聽自然無 <>天下本無事,庸人自擾之
kenken
一般會員


發表:12
回覆:28
積分:8
註冊:2003-05-15

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-05-19 22:29:07 IP:203.203.xxx.xxx 未訂閱
沒有啦,拜你們二位大大所賜,你們教的好!! 謝謝你們!!
kenken
一般會員


發表:12
回覆:28
積分:8
註冊:2003-05-15

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-05-19 22:30:41 IP:203.203.xxx.xxx 未訂閱
沒有啦,拜你們二位大大所賜,你們教的好!! 謝謝你們!!
kenken
一般會員


發表:12
回覆:28
積分:8
註冊:2003-05-15

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-05-19 22:44:34 IP:203.203.xxx.xxx 未訂閱
引言: 看來還是Royce520前輩比較厲害, 我的表達能力與文筆皆不好, 所以只能找找資料看看是否能幫幫kenken, 現在再加上Royce520前輩的解說, 相信對kenken的幫助更大了, kenken的領悟力也很好,加油喔! 如果完全了解後,也可以用您的想法將資料整理一份, 與大家分享您的學習心得, 以方便有需要的會員朋友查詢。 ======================= <>涵養怒中氣。謹防順口言。留心忙裡錯。珍惜有時錢。 <>是非終日有,不聽自然無 <>天下本無事,庸人自擾之 < face="Verdana, Arial, Helvetica"> 如果全會的話,一定會上來幫助一些網友的,分享一些經驗!!
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-05-20 08:46:07 IP:61.224.xxx.xxx 未訂閱
... 插個話 ...    原函式 void convert(int a[]); 已表示,將一個整數陣列指標傳入,而在傳入後,在 convert 函式可以對 a[] 做讀寫的動作。如果 a[i] 的數值修改了,那叫用它所傳入的陣列自然就會被修改了,如果你不希望輸入的指標被 convert 修改,那可以改用 void convert(const int a[]); 這樣的宣告表示 convert 函式只能對 a[] 陣列讀取,不能寫入,如:
void convert(const int a[])
{
  int b[SIZE];
  for(int i=0;i<SIZE;i  ) // 反轉矩陣內的值
    b[i]=a[SIZE-i-1];
  for(int i=0;i<SIZE;i  ) //
    a[i]=b[i];            // <--- Compile 時就會 ERROR!
                          // E2024 Cannot modify a const object
}
在 compile 時就會發生錯誤! 在 ANSI C/C 的標準函式庫中,我們常常可以看到叫用函式的某參數都會加上 const 的字樣,其所代表的就是,您所輸入的參數(陣列)的內容不會被叫用的函式修改! 我們自己在寫函式時,通常不會想到要將「純讀取」的參數加上 const,可能是覺得太麻煩吧 不過,加上去的好處是,如果您的函式寫錯,在 > <>沒空更新的網頁... href="http://dllee.adsldns.org">http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell.... 發表人 - dllee 於 2003/05/20 09:16:28
------
http://www.ViewMove.com
kenken
一般會員


發表:12
回覆:28
積分:8
註冊:2003-05-15

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-05-20 13:07:37 IP:203.203.xxx.xxx 未訂閱
引言: ... 插個話 ... 原函式 void convert(int a[]); 已表示,將一個整數陣列指標傳入,而在傳入後,在 convert 函式可以對 a[] 做讀寫的動作。如果 a[i] 的數值修改了,那叫用它所傳入的陣列自然就會被修改了,如果你不希望輸入的指標被 convert 修改,那可以改用 void convert(const int a[]); 這樣的宣告表示 convert 函式只能對 a[] 陣列讀取,不能寫入,如:
void convert(const int a[])
{
  int b[SIZE];
  for(int i=0;i
在 compile 時就會發生錯誤!    在 ANSI C/C   的標準函式庫中,我們常常可以看到叫用函式的某參數都會加上 const 的字樣,其所代表的就是,您所輸入的參數(陣列)的內容不會被叫用的函式修改!
我們自己在寫函式時,通常不會想到要將「純讀取」的參數加上 const,可能是覺得太麻煩吧  不過,加上去的好處是,如果您的函式寫錯,在  >    <>沒空更新的網頁...
 href="http://dllee.adsldns.org">http://dllee.adsldns.org  介紹Shells,LiteStep,GeoShell....    發表人 - dllee 於 2003/05/20  09:16:28
也感謝dllee大大的教學,讓我又多學到了一招!! 努力的向各位前輩們學習學習!!
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-05-20 13:20:57 IP:140.135.xxx.xxx 未訂閱
kenken您好:    記得要結案,鼓勵熱心幫忙的人喔 <>~我也是在學習的階段,所以請您多多見諒與指教~
系統時間:2024-05-15 13:07:35
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!