[問題] 結構與函式

看板C_and_CPP作者 (杰)時間9年前 (2015/02/18 16:30), 編輯推噓8(8014)
留言22則, 8人參與, 最新討論串1/1
小弟算是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

02/18 16:51, , 1F
陣列是一塊連續的記憶體空間,需要知道它起始於哪個位
02/18 16:51, 1F

02/18 16:53, , 2F
和陣列有多少個元素。所以將陣列傳入函數時,通常要給
02/18 16:53, 2F

02/18 16:55, , 3F
陣列的頭,也就是Deck[],和陣列的元素個數
02/18 16:55, 3F

02/18 16:59, , 4F
如果fillDeck只是變動一張卡片的話,傳指標進去
02/18 16:59, 4F

02/18 17:04, , 5F
可以修改一塊Card的suit和face。至於寫Deck[]也給過
02/18 17:04, 5F

02/18 17:07, , 6F
Const Card* wDeck 和 Card wDeck[]是幾乎一樣的
02/18 17:07, 6F

02/18 17:13, , 7F
ex:wdeck[13]就是先找到指標wdeck的起始位置
02/18 17:13, 7F

02/18 17:14, , 8F
然後跳過13個位置 。所以回來看,單純的wdeck[]就是
02/18 17:14, 8F

02/18 17:15, , 9F
指標
02/18 17:15, 9F

02/18 17:15, , 10F
換句話說,前者你並沒有傳進一個陣列 只是傳指標
02/18 17:15, 10F

02/19 05:12, , 11F
兩者在stack的使用上有沒有分別?
02/19 05:12, 11F

02/19 09:04, , 12F
我也是新手 但聽說 直接運用pointer的運算 比用陣列下
02/19 09:04, 12F

02/19 09:05, , 13F
標的運算 來的快
02/19 09:05, 13F

02/19 11:24, , 14F
謝謝各位熱心的大大回覆 所以照大家的說法應該是
02/19 11:24, 14F

02/19 11:25, , 15F
函式宣告時 Const Card* wDeck 和 Card wDeck[]兩者是一樣
02/19 11:25, 15F

02/19 11:26, , 16F
的囉? 謝謝大家!
02/19 11:26, 16F

02/19 13:55, , 17F
印象中兩種宣告都一樣 實際上都是傳指標
02/19 13:55, 17F

02/21 02:28, , 18F
上面的大大們有解答 不過這邊再提醒一下 C/C++ 傳原生陣列
02/21 02:28, 18F

02/21 02:29, , 19F
都是傳入第一個元素的指標,所以在函數內不能對陣列用
02/21 02:29, 19F

02/21 02:30, , 20F
sizeof, 這個坑要小心
02/21 02:30, 20F

02/21 12:11, , 21F
小弟是否記錯 應該是Card* Const wDeck 和 Card wDeck[]
02/21 12:11, 21F

02/21 12:13, , 22F
才是一樣的 而不是 Const Card* wDeck
02/21 12:13, 22F
文章代碼(AID): #1Kv4sl76 (C_and_CPP)