5

この質問があります: 開始アドレスが 100 だとします。

int arr[2][3][2] = {{{2,4},{7,8},{3,4}},{{2,2},{2,3},{3,4}}};
printf(“%u %u %u %d \n”,arr,*arr,**arr,***arr); // Line 2
printf(“%u %u %u %d \n”,arr+1,*arr+1,**arr+1,***arr+1); // Line 3
}
Answer:
100, 100, 100, 2
114, 104, 102, 3

説明:

行 3 の場合: arr+13 番目の次元で増加すると 114 の値を指し*a+1、2 番目の次元で増加すると 104 を指し**arr +1 、1 番目の次元が増加して 102 を指し、***arr+1最初に最初の位置で値を取得し、次にそれを 1 ずつ増加させます。 2行目の出力。

メモリ レイアウト

私の質問 - 私は最善を尽くしました。しかし、3行目の説明が何を意味するのかを理解できました! 説明してください

4

3 に答える 3

10

の型は何int arr[2][3][2]ですか? タイプ の 2 つの要素の配列ですint [3][2]。これが三次元です。

とはint [3][2]? 型の 3 つの要素の配列ですint [2]。これが二次元です。

とはint [2]? タイプ の 2 つの要素の配列ですint。これは 1 次元です。

ここに図があります

ここに画像の説明を入力

2 行目:

  • arr3 次元の最初の要素を指し、
  • *arr2 次元の最初の要素を指し、
  • **arr1 次元の最初の要素を指し、
  • ***arr1 次元の最初の要素の値を取ります。

図から、すべての次元が address から始まることがわかります100。したがって、2 行目の出力は "100, 100, 100, 2" です。

3 行目:

  • arr + 13 次元の 2 番目の要素を指し、
  • *arr + 12 次元の 2 番目の要素を指し、
  • **arr + 11 次元の 2 番目の要素を指し、
  • ***arr + 11 次元の最初の要素の値を取り、それをインクリメントします。

図から、3 次元の 2 番目の要素にはアドレス112(114 ではありません!)、2 次元の 2 番目の要素には address 104、1 次元の 2 番目の要素には address があることがわかります102。したがって、3 行目の出力は "112, 104, 102, 3" でなければなりません。

于 2013-06-19T23:51:14.170 に答える
0

あなたの例の中の「説明」にはあまり価値がありません。ほら、あなたは物事を混同しています。それはあなたの multi- -ing (* *arr など) は、C の malloc で割り当てる場合にのみ有効です。次に、2D 配列の行は (int *) 型の arr[i] であり、任意の行内の列の値は (int) 型の arr[i][j] であり、2D 行列全体は * arr 型です。 (整数 * )。3D では、タイプ (int) の arr[i][j][k] から ** arr までの 3D 構造全体があります。しかし、int arr[2][3][2] = {...} を使用すると、単に arr[i][j][k] を使用して行列要素を取得し、つまり arr[0], arr[1] を使用して行。ポインターは、コンパイル時に割り当てられた 2-3D 行列ではあまり役に立ちません。* *arr はポインタへのポインタへのポインタであることを常に覚えておいてください。よろしく、M.

于 2013-06-19T23:31:31.253 に答える