-1

一部の C コードの処理に問題があります。誰かがこの構文を説明できますか:

void some_function(Int16 omegaFlag[2][8])
{
    for(i = 0; i < 2; i++)
    {
        Int16 *Flag = omegaFlag[i] + 1;
        for(j = 0; j < k; j++)
        {
            // do some stuff
            *Flag++ = some_integer_value;
        }
    }
}

1.Int16 omegaFlag[2][8]渡されたパラメーターがsome_function()インデックス値を宣言するのはなぜですか? 彼らはコードをどのように支援していますか (一般的に、このコードに固有のものではありません)?
2. *Flag++ = some_integer_value; : この行はどういう意味ですか?

4

3 に答える 3

3

への最初のインデックスomegaFlag[2][8]は必須ではなく、コンパイラによって無視されます。ただし、2 番目は重要です。これは、各行に 8 つの要素が含まれる 2 次元配列をコンパイラに伝えるため、ポインターを進めると 8 つの要素が進むことになります。

omegaFlag[2][8]omegaFlag[][8]またはと同等(*omegaFlag)[8]です。**omegaFlagただし、メモリ レイアウトのためとは異なります。**omegaFlagはポインターの配列であり、omegaFlag[2][8]は配列の配列です -- 正確に 8 要素のスペース、または合計 16 要素のスペースがあります。

*Flag++Flag を逆参照し、その値を 1i増やします。Flag は、行列 omegaFlag の 2 番目の行の 2 番目の値を表す Int16 へのポインタです。割り当ては、その要素に値を割り当て、Flag を次の要素を指すように進めます。これは、ループの次の反復で割り当てられます。

于 2012-09-15T15:14:23.023 に答える
1

配列omegaFlagはポインターを使用して変更されます。もちろん、このように書くことができる場合、これはポインターの不必要な使用であり、読みやすくなります。

 for(i = 0; i < n; i++)
    {
        for(j = 1; j < k; j++)
        {
            // do some stuff
            OmegaFlag[i][j] = some_integer_value;
        }
    }

もちろん、配列の境界外へのアクセスは未定義の動作です。つまり、n>2 または k>7 です。

于 2012-09-15T15:14:34.503 に答える
1
  1. パラメータ宣言は、関数が指定された次元で Int16 の配列を受け取ることを通知します。より具体的には、配列の配列です。

  2. * 記号は、ポインタ、またはメモリ内の場所を示します。※Flagとは「Flagの内容が指し示す場所」を意味し、代入とは「この値をその場所に置く」ことを意味します。++ は、Flag が指す位置を、使用後に 1 ずつ増やす必要があることを示します。たとえば、メモリ位置 12345 を指していた場合は、位置 12346 を指します。配列は、この方法でポインターを介して参照できます。受信配列はこの構文によって変更されています...ただし、読みにくくなる可能性があります:)

それが役立つことを願っています。

于 2012-09-15T15:16:24.550 に答える