c++ - ポインターと多次元配列の質問

原文 c++ arrays pointers multidimensional-array

私は自分にC++を教えており、現在は多次元配列について学んでいます。以下は私が使用しているコードです。コードの下に、私が問題を抱えている質問/概念があります。

int main(){
    const unsigned row = 4, col = 4;
    int arr[row][col], cnt = 0;

    for (int(*a)[col] = arr; a != arr + col; ++a){
        for (int *b = *a; b != *a + col; ++b){
            *b = cnt;
            ++cnt;
        }
    }

    system("pause");
    return 0;
}



forステートメントfor (int(*a)[col] = arr; a != arr + col; ++a)の最初の行。 int(*a)[col] = arr;が必要な理由
[col]ループのforは正しく実行されますか?
2番目のforステートメントfor (int *b = *a; b != *a + col; ++b)の最初の行。 *aはポインターを逆参照していませんか?
2番目のforステートメントは、それがどのように機能するかについて、私には不明確です。どの順序で実行されるかは理解していますが、最初のforステートメントと2番目のforステートメントの関係がわかりません。の説明は非常に役立ちます。
答え
ポインタには、指すタイプがあります。 void *を除いて、ポインターはそのタイプのオブジェクトのアドレスのみを保持できます。

1行目:配列の各行をループしているので、ポインターは(単一のintではなく)行全体を指す必要があります。

2行目では、*aaを逆参照しています。 *a。常にa[0]と同等です。 aは行を指すため、a[0]はその行を示します。

a[0]は配列なので、bの初期化に使用すると、その行の最初の要素へのポインターに減衰します。

最初のtlookは各行をループします。 2番目のループは、ech列をループします。それは次のものと同じ構造です:

for (int i = 0; i < row; ++i)
    for (int j = 0; j < row; ++j)
        arr[i][j] = ++cnt;


後でポインタに追加される整数オフセットの代わりにポインタを使用している場合を除きます。
関連記事

c++ - Qt:フォーム全体にフォントの変更を適用する

java - 最小の「XOR」演算でバイナリマトリックスを再作成する

c++ - doxygenの「ファイルドキュメント」リストから「README.md」を除外します

java - Android Gstreamer SDKでANativeWindow_lockがエラー-22を返す

c++ - C++プロキシDLL(64ビット)

c++ - 誤った値を返す二重ハッシュ関数

c++ - OpenCVでのレーン検出器分割線C++

c++ - Qtでマウスイベントが発生したときに呼び出される関数の宣言

c++ - リンクリストで変更されたデータはメモリに反映されません

c++ - C++とFortranの並列MM速度差ループタイリング