-1

これはMicrosoftTestからの質問です。

 main()
    {
        int a[2][3]= { (1,2,3),(4,5,6)};
        int (*ptr)[3] = &a[0];
        printf("%d %d\n", (*ptr)[1],(*ptr)[2]);
        ptr+=1;
        printf("%d %d\n", (*ptr)[1],(*ptr)[2]);

    }

提供されるオプションは次のとおりです。

  1. セグメンテーション違反
  2. コンパイラエラー
  3. バスエラー
  4. ランタイムエラー

このコードを実行しましたが、何も取得できませんでした。私は次の答えを得ました:

6 0   
0 0   

何が起こっているのか理解するのを手伝ってくれませんか。

4

2 に答える 2

8

主な問題はこの行です:

    int a[2][3]= { (1,2,3),(4,5,6)};

中括弧の代わりに括弧を使用しています。(1,2,3)の結果はちょうど3であり、(4,5,6)の結果はちょうど6です。したがって、これは次と同等です。

    int a[2][3]= { 3,6 };

これは順番に同等です

    int a[2][3] = { {3,6,0}, {0,0,0} };

この行は、ptrがa[0]を指すようにします。

    int (*ptr)[3] = &a[0];

この行

    printf("%d %d\n", (*ptr)[1],(*ptr)[2]);

その場合、

    printf("%d %d\n", (*&a[0])[1],(*&a[0])[2]);

これは次のように簡略化できます

    printf("%d %d\n", (a[0])[1],(a[0])[2]);

あるいは単に

    printf("%d %d\n", a[0][1],a[0][2]);

この行

    ptr+=1;

ptrがaの次の要素を指すようにするため、次のようになります。

    ptr=&a[1];

したがって、次の行は次のように簡略化されます

    printf("%d %d\n", a[1][1],a[1][2]);

プログラムは、a [0] [1]、a [0] [2]、a [1] [1]、およびa [1] [2]を効果的に出力するため、6,0,0,0が得られます。

Charles Baleyは、main()にreturn型がないことを指摘しています。これは彼らが得ているものかもしれません。コンパイラは通常、少なくともそれについて警告を出します。

于 2012-09-25T05:27:28.983 に答える
2

テキストを正しくコピーしましたか?

(1,2,3)2 つのシーケンス演算子またはコンマ ( ,) 演算子を含む式です。その値(4,5,6)は3 . 0 はであり、デフォルトの初期化は 0 です。次に、 をインクリメントして を指すので、出力しますおよびもデフォルトの初期化が 0 です。a[0][1]a[0](*ptr)[1]a[0][2]ptra[1]a[1][1]a[1][2]

于 2012-09-25T05:38:09.100 に答える