看板 C_and_CPP 關於我們 聯絡資訊
小弟算是C語言的新手 不好意思有些問題想請教各位 目前看書"How to program C" 練習到高效率洗牌程式 擷取部分的程式碼如下: #include <stdio.h> struct card { const char *face; const char *suit; } typedef struct card Card; void fillDeck(Card *wDeck,...) int main() { Card deck[52]; fillDeck(deck,...); ... } 疑問點是為什麼函式在宣告的時候不是寫成下面這樣 (把一個陣列丟進去) void fillDeck(Card wDeck[],...) 而是丟入一個指標 void fillDeck(Card *wDeck,...) 這兩個寫法會有差別嗎? 有試著在宣告時選擇丟入一個陣列 跑出來結果好像也一樣 不知道是兩者本來就一樣 還是是我哪邊想錯了呢? 麻煩各位大大幫忙一下了 謝謝大家! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.25.32.15 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1424248239.A.1C6.html
sunhextfn: 陣列是一塊連續的記憶體空間,需要知道它起始於哪個位 02/18 16:51
sunhextfn: 和陣列有多少個元素。所以將陣列傳入函數時,通常要給 02/18 16:53
sunhextfn: 陣列的頭,也就是Deck[],和陣列的元素個數 02/18 16:55
sunhextfn: 如果fillDeck只是變動一張卡片的話,傳指標進去 02/18 16:59
sunhextfn: 可以修改一塊Card的suit和face。至於寫Deck[]也給過 02/18 17:04
sunhextfn: Const Card* wDeck 和 Card wDeck[]是幾乎一樣的 02/18 17:07
bben900911: ex:wdeck[13]就是先找到指標wdeck的起始位置 02/18 17:13
bben900911: 然後跳過13個位置 。所以回來看,單純的wdeck[]就是 02/18 17:14
bben900911: 指標 02/18 17:15
bben900911: 換句話說,前者你並沒有傳進一個陣列 只是傳指標 02/18 17:15
shaopin: 兩者在stack的使用上有沒有分別? 02/19 05:12
brett10592: 我也是新手 但聽說 直接運用pointer的運算 比用陣列下 02/19 09:04
brett10592: 標的運算 來的快 02/19 09:05
hergay: 謝謝各位熱心的大大回覆 所以照大家的說法應該是 02/19 11:24
hergay: 函式宣告時 Const Card* wDeck 和 Card wDeck[]兩者是一樣 02/19 11:25
hergay: 的囉? 謝謝大家! 02/19 11:26
jaid: 印象中兩種宣告都一樣 實際上都是傳指標 02/19 13:55
NilPtr: 上面的大大們有解答 不過這邊再提醒一下 C/C++ 傳原生陣列 02/21 02:28
NilPtr: 都是傳入第一個元素的指標,所以在函數內不能對陣列用 02/21 02:29
NilPtr: sizeof, 這個坑要小心 02/21 02:30
tanted: 小弟是否記錯 應該是Card* Const wDeck 和 Card wDeck[] 02/21 12:11
tanted: 才是一樣的 而不是 Const Card* wDeck 02/21 12:13