我从一个数组中处理卡片类型的结构。
struct card deck[DECKSIZE]; //The deck is an array of cards structures
我使用的是二维数组。卡片类型结构的数组
struct card allHands[hands][cards];
我使用此函数将牌组和数组作为带有数组参数的指针传递。我还更改了牌组指针的位置,以模拟牌组在将牌传递给玩家时丢失牌。
void dealHands(struct card *deck, struct card **handArray, int hands, int cards){
int players;
int cardCount;
int passCard = 0;
struct card * thisDeck;
thisDeck = deck;
for(players = 0; players < hands; players++){
for(cardCount = 0; cardCount < cards; cardCount++){
handArray[players][cardCount] = thisDeck[passCard];
passCard++;
}
}
deck = (deck + passCard);
}
我用 C 编程已经有很长一段时间了,所以我认为这就是您制作原型(prototype)的方式?
void dealHands(struct card[], struct card*[], int, int);
这就像我如何实现该功能的主要框架。
int main(int argc, char *argv[])
{
/* Declare and initialize variables */
int hands = atoi(argv[HANDSINPUT]); //How many players
int cards = atoi(argv[CARDSINPUT]); //How many cards per hand
struct card deck[DECKSIZE]; //The deck is an array of cards structures
struct card allHands[hands][cards];
//Builds the deck
//Shuffles deck with a RNG and swapping every card
int players;
int cardCount;
int passCard = 0;
dealHands(deck, allHands, hands, cards);
}
我在编译过程中得到以下 2 条语句
警告:从不兼容的指针类型传递‘dealHands’的参数 2 [默认启用] dealHands(牌组,allHands,手,牌); ^
注意:应为“struct card **”,但参数类型为“struct card ()[(sizetype)(cards)]” void dealHands(struct card[], struct card[], int, int); ^
当我需要在函数中调用指针和数组时,我总是搞砸了。所以我不确定我的逻辑哪里有问题。我在哪里传递地址而不是值,反之亦然?
最佳答案
将数组作为函数参数传递时最重要的是:不能将数组传入/传出函数。
说到这里,请仔细阅读以下内容。 (为简单起见,我将使用 int
,当然您也可以使用其他类型。)
但是你可以传递一个数组的“指向第一个元素的指针”。幸运的是,C 会自动进行转换。更重要的是,除了三个异常(exception)(sizeof
、_Alignof
、&
运算符),C 会自动将数组名称转换为此类指针.这通常称为“数组衰减到指向第一个元素的指针”。
但是这种衰减不是递归的。因此,如果将二维数组传递给函数,它会衰减为指向一维数组的指针:
int a[1][2]; // 1 = outer dimension, 2 = inner
传递给函数时
void f(int a[1][2]);
成为
int (*a)[2] // pointer to array of inner dimension
或者可以显式地使用指针语法
void f(int (*a)[2]);
对于所有情况,a
的类型都是int (*)[2]
。注意括号!您使用哪种语法基本上是个人喜好。我更喜欢所有维度的数组语法,因为它更清楚地记录了意图。
除了最外面的维度,你总是必须通过所有尺寸。这仅用于文档而不是必需的(请参见下面的示例)。
在函数内部,您使用普通索引运算符:
int t, i; // index variable for ouTer, Inner
a[t][i];
请注意,这可以应用于更高维度的数组。对于一维数组,这实际上也适用。只需删除内部维度:
int a[1];
衰减到
int *a;
(我只是用常量1
和2
来给维度编号;当然你可以使用你想要的维度。)
如果你想传递一个可变长度的数组(VLA,_variable length array),你必须把除了最外层的维度都传递给函数:
f(int inner, a[][inner]);
但是对于检查等更好的是传递所有维度:
f(int outer, int inner, a[outer][inner]);
关于c - 传递一个二维结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35614862/