c - 传递一个二维结构数组

标签 c pointers multidimensional-array struct

我从一个数组中处理卡片类型的结构。

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;

(我只是用常量12来给维度编号;当然你可以使用你想要的维度。)


如果你想传递一个可变长度的数组(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/

相关文章:

c - 指针和函数外部分配或静态变量和内部分配?

c++ - const-correctness 是否给编译器更多的优化空间?

c - 如何更改二维数组中的位置

Java - 可实例化中的计算方法在运行时似乎被绕过

Java:多维数组

c - 为具有相同主体的结构赋予不同的名称

c - 从函数返回指针数组

c - `fsetpos()`如何用于 "allow random access on files that are too large to handle with ` fseek( )`?"

c - 如何在 Windows/MSVC 上自动查找或构建 C 库依赖项?

c++ - 使用 static 关键字复制符号和函数