1

arr配列のコンテキストでポインターをかなり理解しarrていると思ってリラックスしていたとき、私はこの次のプログラムについて再びひっくり返りました&arr。しかし、次のプログラムの出力をしっかりと把握できていません。視覚化しようとしましたが、部分的にしか成功しませんでした。私のような人がこの混乱を乗り越えられるように、このことについて厳密で詳細な説明をいただければ幸いです。永久に。

次のプログラムでは、「2D」配列を使用しました。サイズが 2になることはdemo[][2]わかっています。また、単独で使用すると 型になることもわかっています。それでも、次のことについて迷っています。demo[]array of arraysdemo(*)[2]

1)なぜ&demo[1]同じですか? 2 番目の配列のアドレスであるはずでdemo[1]はありませんか?では、一体何が何で、なぜ 2 番目の配列のアドレスと同じなのですか?demo[1]&demo[1]

2)printf() 2 番目と 4 番目が同じであることは知っていますdemo[1]が、それ*(demo+1). (デモ+1) ? が と同じであることはよく知られていますが、どのようにして と等しいのでしょうか? 「何か」がその「何か」の値とどのように等しくなることができますか?printf()demo[1]*(demo+1)demo+1*(demo+1)

3)そして、私があまり頭が良くないことが証明されたので、推測ゲームをやめて、次の型が何であるかについて決定的な答えを求める必要があります。

&demo[1]
デモ[1]
デモ+1

#include<stdio.h>

int main(void)
{
    int demo[4][2]= {{13,45},{83,34},{4,8},{234,934}};
    printf("%p\n",&demo[1]);
    printf("%p\n",demo[1]);  //Should have cast to (void*),but works still
    printf("%p\n",demo+1);
    printf("%p\n",*(demo+1));
}

出力:

0023FF28
0023FF28
0023FF28
0023FF28
4

3 に答える 3

0
                        +-------+------+
                        |       |      |
                        |   13  |  45  |
                   101  |       |      | 105
                        +--------------+
                        |       |      |
                        |   83  |  34  |
                   109  |       |      | 113 
                        +--------------+
                        |       |      |
                        |   04  |  08  |
                   117  |       |      | 121 
                        +--------------+
                        |       |      |
                        |   234 | 934  |
                   125  |       |      | 129 
                        +--------------+

注:仮定sizeof(int) = 4

2Dレイアウトを想定しています(メモリ内ではそうではありませんが、それらはすべて一列に並んでいます)

demo[i]は2D 配列のith行です。それ自体が 1D 配列です。 demo[1]13行目です。[住所のある方を意味します109]。

&demo[1] 

のアドレスでdemo[1]あり、その行のベースアドレスと同じです。1D 配列と同様です。配列名は、1 番目の場所のアドレスを示します。ここで 1D 配列名はdemo[1]

demo[1] 

配列名も配列のベースアドレスを与えるので、それは同じです&demo[1]

demo+1

demoはポインタであり、値があります101demo(すなわちdemo[0])タイプ1行[粗雑な説明です。私が意味するのは、2 つの要素を持つ行のサイズです - (*)[2]] したがってdemo+1、次の行を指すようにインクリメントします。どちらが正気かdemo[1]

*(demo+1)

demo+1 is the 1<sup>th</sup> row 

そして*(demo+1)、その場所での価値を意味します。これ自体が配列であるため、アドレスを指定します。配列名はアドレスを与えるので

于 2013-05-13T07:44:16.117 に答える