1

我使用swapCardsRandomly(b)但是当我尝试swapCardsRandomly(*b)程序时仍然可以正常工作,没有任何问题。

那有什么区别呢?

/*
*shuffles cards randomly
*/
void shuffle( int b[][13] ) {

    int counter;
    int rand1 = rand() % 4;
    int rand2 = rand() % 13;

    b[rand1][rand2] = 1;

    counter = 2;
    while ( counter < 53 )
    {
        rand1 = rand() % 4;
        rand2 = rand() % 13;

        while ( b[rand1][rand2] != 0 )
        {
            rand1 = rand() % 4;
            rand2 = rand() % 13;
        }

        b[rand1][rand2] = counter++;
    }
    swapCardsRandomly( b );
}

//for better shuffling swap elements randomly
void swapCardsRandomly( int m[][13] ) {

    int temp;
    int rand1; 
    int rand2;

    for ( i = 0; i < 4; i++ )
    {
        for ( j = 0; j < 13; j++ )
        {
            rand1 = rand() % 4;
            rand2 = rand() % 13;

            temp = m[i][j];
            m[i][j] = m[rand1][rand2];
            m[rand1][rand2] = temp;

        }
    }
}
4

4 回答 4

2

两者都b具有*b相同的地址 ( b[0][0]),请检查:

int b[1][13];
printf("%p %p %p\n", (void *)b, (void *)*b, (void *)&(b[0][0]));

但是存在指针类型冲突*b

demo.c:52:1: warning: passing argument 1 of ‘swapCardsRandomly’ from incompatible pointer type [enabled by default]
demo.c:9:7: note: expected ‘int (*)[13]’ but argument is of type ‘int *’
于 2013-07-25T15:25:26.463 回答
1

这是因为在价值方面两者*bb相等,即(void*)b == (void*)(*b)== true

b是一个二维矩阵 =b[rand1][rand2]=1;

矩阵名称的类型b 是衰减到二维数组中第 0 行int[][13]第一个元素的地址。(您可以将二维数组视为一维数组的数组)。

因为b是第 0 行的地址所以*b衰减为第 0 行的b[0][0]0元素的地址。有趣的是价值(数量)明智两者都是平等的,这就是您的代码有效的原因。当您使用or参数调用函数时,地址值会自动转换为正确的类型。*bbint [][13]

要观察它,请在您的代码中尝试以下 printf 语句:

printf("\n %p  %p\n", b, *b);

你会发现两者是平等的!

要通过图表更好地理解它,请阅读以下内容:A[0], &A,*A链接答案。

于 2013-07-25T15:22:30.823 回答
1

在多维数组中,第一个元素和指向第一行的指针具有相同的地址。这是因为数组的第一个元素与数组具有相同的地址。因此,在您的情况下,b指向数组的第一个元素int [][13]*b指向int [13]恰好是数组第一行的int [][13]数组的第一个元素。

下一个问题是为什么它允许你传递*bSwapCardsRandomly它期望int [][13]作为参数的时间。答案是数组,包括多维数组,在 C 中不是正确的类型,因此当以这种方式传递时,它会将它们视为解释指针的一种方式。

于 2013-07-25T16:05:28.273 回答
0

因为b*b的值相等,但类型不同,即这两个指针表达式的类型不同,但指向相同的内存位置。

  1. b衰减为指向第一行(第 0 行)的指针,它的类型为int (*)[]. 因此 *b 取消引用指针表达式b
  2. *b是类型int (*)[]。因为这是一个数组类型,所以它衰减为指向数组对象第一个元素的指针。所以它是 type int*

如需详细解释,请务必阅读此答案

于 2013-07-25T15:15:49.580 回答