[問題] 結構與函式

作者: hergay (賀給)   2015-02-18 16:30:37
小弟算是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,...)
這兩個寫法會有差別嗎?
有試著在宣告時選擇丟入一個陣列 跑出來結果好像也一樣
不知道是兩者本來就一樣 還是是我哪邊想錯了呢?
麻煩各位大大幫忙一下了 謝謝大家!
作者: sunhextfn (阿毛)   2015-02-18 16:51:00
陣列是一塊連續的記憶體空間,需要知道它起始於哪個位和陣列有多少個元素。所以將陣列傳入函數時,通常要給陣列的頭,也就是Deck[],和陣列的元素個數如果fillDeck只是變動一張卡片的話,傳指標進去可以修改一塊Card的suit和face。至於寫Deck[]也給過Const Card* wDeck 和 Card wDeck[]是幾乎一樣的
作者: bben900911 (Ben)   2015-02-18 17:13:00
ex:wdeck[13]就是先找到指標wdeck的起始位置然後跳過13個位置 。所以回來看,單純的wdeck[]就是指標換句話說,前者你並沒有傳進一個陣列 只是傳指標
作者: shaopin (Brian)   2015-02-19 05:12:00
兩者在stack的使用上有沒有分別?
作者: brett10592   2015-02-19 09:04:00
我也是新手 但聽說 直接運用pointer的運算 比用陣列下標的運算 來的快
作者: hergay (賀給)   2015-02-19 11:24:00
謝謝各位熱心的大大回覆 所以照大家的說法應該是函式宣告時 Const Card* wDeck 和 Card wDeck[]兩者是一樣的囉? 謝謝大家!
作者: jaid (jaid)   2015-02-19 13:55:00
印象中兩種宣告都一樣 實際上都是傳指標
作者: NilPtr (神奇的空指標)   2015-02-21 02:28:00
上面的大大們有解答 不過這邊再提醒一下 C/C++ 傳原生陣列都是傳入第一個元素的指標,所以在函數內不能對陣列用sizeof, 這個坑要小心
作者: tanted (為何世界會那麼不單純)   2015-02-21 12:11:00
小弟是否記錯 應該是Card* Const wDeck 和 Card wDeck[]才是一樣的 而不是 Const Card* wDeck

Links booklink

Contact Us: admin [ a t ] ucptt.com