-5

ここで質問です: プログラムの出力は何ですか?

#include<stdio.h>
int main()
{
int  A[2][10]={{1,2,3,4,5,6,7,8,9,10},{11,12,13,14,15,16,17,18,19,20}   };
int (*v)[10]=A;

printf("**v=%d\n",**v);
printf("**(v+1)=%d\n",**(v+1));
printf("*(*v+1)=%d\n",*(*v+1));
printf("*(v[0]+1)=%d\n",*(v[0]+1));
printf("*(v[1])=%d\n",*(v[1]));
}

出力:

**v=1
**(v+1)=11
*(*v+1)=2
*(v[0]+1)=2
*(v[1])=11

特に、*v がどのように配列 A を 10 分割したかがよくわかりません。それぞれの出力について理由を教えてください。ありがとう!

4

3 に答える 3

3
  1. では**v、アドレスであるの値に*v置き換えられます。v[0]X*X1

  2. では**(v+1)、これもアドレスであるに*(v+1)なり、外側のアスタリスクはアドレスの値を示します。これはです。v[1]YY11

  3. *(*v+1)=2=> *(v[0] + 1)=> ここでポインタは次の場所に移動し、この場所はv[0][1]に似てい*(*(v+0)+1)ます。の値はv[0][1]です2

  4. *(v[0]+1)=2、 同じ理由。

  5. *(v[1])=11は、v[1]2 番目の行の 2 番目の列の開始アドレスである 2 番目の行のベース アドレスを保持し、0その位置の値は です11

于 2013-08-05T09:36:15.863 に答える
0

さて、最初に、配列がどのように減衰するか、次に、宣言がどのように機能するかを確認しましょう。

Aは 2D 配列として宣言されています。を任意の式で使用するAと、最初の要素へのポインターに「減衰」します。C では、2D 配列は 2 つの 1D 配列で構成されます。したがって、2D 配列の要素は 1D 配列です。したがって、任意の式で を使用すると、10 個の整数の配列である Aの最初の行へのポインターに減衰します。A

int (*v) [10]vは、10 個の int の配列へのポインターであることを意味します。割り当て

int (*v)[10] = A;

は式なので、A10 個の int へのポインターにも減衰しているため、代入は有効です。

つまり**v、2D 配列の最初の行であるポイントをv取得していることを意味します。v次に、 を逆参照*vしています。つまり、最初の行の最初の要素を取得しています。それは 1 なので、出力は 1 です。

を見ると**(v + 1)、まずポインタに 1 を加算していますv。行を指しているためv、1 を追加すると次の行へのポインターが得られます。次に、上記のように二重逆参照を行い、次の行の最初の要素である 11 を取得します。

を見ると*(*v + 1)、最初に を逆参照vしています。つまり、最初の行を取得しています。次に、それに 1 を追加すると、行の次の要素へのポインターが取得されます。次に、それを逆参照して、2 番目の要素である 2 を取得します。

要約vすると、最初の行全体を指します。*v最初の行の最初の要素を指します。(v + 1)2 行目全体を指します。(*v + 1)最初の行の 2 番目の要素を指します。

この後、残りを理解するのはおそらく非常に簡単です。

于 2013-08-05T09:44:47.370 に答える