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を持っています。これを確認してください。*bb[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は 2 次元行列 =b[rand1][rand2]=1;

行列名の型はb 、2 次元配列のint[][13]0番目の行である最初の要素のアドレスに減衰します。(2 次元配列は 1 次元配列の配列と考えることができます)。

bは 0番目の行のアドレスなので、0番目の行の 0番目の要素のアドレスである の*bアドレスに減衰します。興味深いのは、値 (大きさ) に関して両方が等しいことです。これが、コードが機能する理由です。または引数を指定して関数を呼び出すと、適切な type に型キャストされた値が自動的にアドレス指定されます。b[0][0]*bbint [][13]

それを観察するには、コードで次の printf ステートメントを試してください。

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

両方が等しいことがわかります。

図でよりよく理解するには、これを読んでください: A[0], &A,*Aリンクされた回答.

于 2013-07-25T15:22:30.823 に答える
1

多次元配列では、最初の要素と最初の行へのポインターは同じアドレスを持ちます。これは、配列の最初の要素が配列と同じアドレスを持つためです。したがって、あなたの場合、配列bの最初の要素を指し、たまたま配列の最初の行である配列の最初の要素を指します。int [][13]*bint [13]int [][13]

次の質問は、引数として期待*bするときに渡せる理由です。答えは、多次元配列を含む配列は C では適切な型ではないため、この方法で渡された場合、配列はポインターを解釈する方法として扱われます。SwapCardsRandomlyint [][13]

于 2013-07-25T16:05:28.273 に答える