1

*(multi + row)値ではなくポインターアドレスを生成するのはなぜですか? 私は混乱していますが、良い説明があるに違いありませんが、まだわかりません。

#include <stdio.h>
#define ROWS 5
#define COLS 10
int multi[ROWS][COLS];
int main(void)
{
    int row, col;
    for (row = 0; row < ROWS; row++)
    {
        for (col = 0; col < COLS; col++)
        {
            multi[row][col] = row*col;
        }

    }
    for (row = 0; row < ROWS; row++)
    {
        for (col = 0; col < COLS; col++)
        {
            printf("\n%d ",multi[row][col]);
            printf("%d ",*(*(multi + row) + col));
        }
    }
    return 0;
}
4

5 に答える 5

7

そうではありません。multiは 2 次元配列であるため、ポインター演算を実行したときに減衰するポインターを逆参照すると、配列 (COLS要素幅) になります。

手順:

  1. int multi[ROWS][COLS];-multiこれは 2 次元配列です。

  2. multi + row- ここmultiでは型のポインターに崩壊しますint (*)[COLS]

  3. *(multi + row)- これは と等価です。multi[row]つまり、この式の型は ですint[COLS]

于 2013-06-10T11:11:41.520 に答える
4

multi は、ブロック ポインターに評価される 2D 配列であるためです。

*(*(multi + row));

値を取得する必要があります。

*(multi + row);

インデックスが 'row' によって決定される行へのポインタとして評価されます

更新

ブロック ポインターは、他のポインターと同様にアドレスを含みますが、その算術演算は、配列の最初の行へのポインターなど、単一の要素ではなくブロックに対して行われます。インクリメントすると、(通常のポインターの場合のように 1 つの要素ではなく) 配列の 1 行がスキップされます。

于 2013-06-10T11:11:58.170 に答える
2

multiは「配列の配列」という形式の型を持つため、ほとんどのコンテキストでは、「配列へのポインタ」という形式の型に減衰します。を追加した後rowも、「配列へのポインター」タイプのままですが、 の最初の配列 (最初の行) 以外の配列を指している可能性がありmultiます。

ここで、*演算子を「配列へのポインター」に適用すると、配列型が生成されますが、これは再び最初の要素へのポインターに減衰します。このポインタの型は「へのポインタint」です。

于 2013-06-10T11:15:26.303 に答える
1

これは 2 次元配列であるため、値を取得する前に 2 つのレベルの間接参照があります。

于 2013-06-10T11:12:08.350 に答える
1

multiieのarrayです。integer arrayint (multi[rows])[cols]

multiへのポインタに減衰できますinteger array。したがって、マルチは に減衰する可能性がありint (*multi)[cols]ます。

あなたがそうするとき、あなたはmulti+rowsこれを本質的にやっています

sizeof(int [cols]) + sizeof(int[cols])...`row` times 

逆参照すると、取得した整数配列の最初の要素の型の要素が取得されarray of intsます。この逆参照されたポインターにオフセットを追加してから、再度逆参照すると、要素が取得されます。addressmulti+row

*(multi+row) /*call this x*/-->gives an element of type int[] and int[] can decay to int*.
*(x+cols) --> gives you the element.
于 2013-06-10T11:40:34.670 に答える