8

以下は、2 次元配列の例です。

int s[5][2] = {
            {0, 1},
            {2, 3},
            {4, 5},
            {6, 7},
            {8, 9}
        };

int (*p)[2];

書いp = &s[0];てもエラーにはなりません。しかし、同じアドレスを指定してp = s[0];もエラーが発生します。&s[0]s[0]

どちらも同じ住所なのになぜ違いがあるのか​​教えてください。

4

3 に答える 3

17

アドレスは同じですが、タイプが異なります。

&s[0]はタイプですint (*)[2]s[0]、タイプはint [2]、に減衰しint *ます。

その結果、で算術演算を実行する場合p、配列上を移動するパターンはそのタイプによって異なります。を書き込んp = &s[0]でからにアクセスすると、にアクセスできp[3][1]ますs[3][1]。一方、を書く場合は、 egwillaccessの最初のサブ配列にアクセスするためにint *q = s[0]のみ使用できます。qsq[1]s[0][1]

于 2012-10-29T10:43:51.463 に答える
0

閉じますが、完全ではありません。sは、配列の最初の要素へのポインタです。これは、その配列のエイリアスでもあります。コンパイラは、特定の数の要素を指していることを認識しています。

したがって、&s [0]は最初の要素のアドレスを返し、s[0]は要素自体を返します。

* pは、ただし、intへの単なるポインタです。それよりも多くの要素があるかもしれませんが、コンパイラは確かに知りません。

于 2012-10-29T10:46:11.770 に答える
-2

(int *)データ型を別のデータ型に割り当てようとすると、gcc(int **)は警告を表示します。他のコンパイラについてはわかりません。

于 2012-10-29T10:44:40.647 に答える