1

コード ( を使用してコンパイルgcc -std=c99) ...

#include <stdio.h>
#include <stdlib.h>

typedef int mytype[8][8];

int main(void)
{
    mytype CB;
    for (int r=0; r<8; r++) {
        for (int c=0; c<8; c++) {
            CB[r][c] = 5;
        }
    }

    mytype *CB2 = &CB;

    for (int r=0; r<8; r++) {
        for (int c=0; c<8; c++) {
            printf("%d ",*CB2[r][c]);
        }
        printf("\n");
    }

    return 0;
}

stdoutall であると想定される間違ったデータ (最初の行のデータのみが正しい) に出力されます5。他の配列項目のポインターがメモリ内でシフトされていることがわかりましたが、その理由はわかりません。

目的は明らかだと思います:CB最初のループで配列の内容を設定し、2 番目のループでそれを出力します。これはモデルのみです。ポインターは必要なのでそこにあります。

私は何を間違っていますか?

4

1 に答える 1

13

演算子の優先順位は、変更する必要があることを意味します

printf("%d ",*CB2[r][c]);

printf("%d ",(*CB2)[r][c]);

配列の添え字演算子[]は、ポインター逆参照演算子よりも優先順位が高い*ため、コードは次のように評価されていました。*(CB2[r][c])

于 2013-06-12T09:44:29.943 に答える