c++ - 关于二维数组在内存中的存在形式的问题
PHPz
PHPz 2017-04-17 15:37:18
0
2
914

书上说二维数组在内存中实际是以一维数组的形式连续存放的,我做了个小测试结果却令我无法理解。

#include <iostream>
using namespace std;

int main() {
    int a[2][2] = {{0,1},{2,3}};
    cout << &a << endl;
    cout << a << endl;
    cout << *a << endl;
    cout << a[0] << endl;
    cout << **a << endl;
    cout << *(a[0]) << endl;
    return 0;
}

输出:

0x7fff396c0210
0x7fff396c0210
0x7fff396c0210
0x7fff396c0210
0
0

那个内存地址处保存的是自己的地址?那么两次解引用不应该还是这个地址才对吗?怎么会变成0???

PHPz
PHPz

学习是最好的投资!

全員に返信(2)
黄舟

これを理解しておく必要があります。C には 1 次元の配列しかありませんが、配列の要素は配列自体も含めて任意の型にすることができるため、2 次元の配列が存在します。この場合、配列名 (この場合、配列名は配列の最初の要素へのポインタ) を逆参照すると、配列の最初の要素が得られ、2 次元配列の最初の要素は 1 つの配列になります。次元配列なので、逆参照もこの 1 次元配列の最初の要素になります。これは、以下の *(a[0]) と同じです。

ご質問の件ですが、配列 a の名前は配列 a の内容へのポインタであり、その値はその最初の要素のアドレスと同じです。 2次元配列の場合、a、a[0]のアドレス、a0のアドレスの3つの値は同じですが、aとa[0]のアドレスは意味が少し異なります。と は同じ意味ですが、 a0 のアドレスは第 1 レベルのポインタ

です。
いいねを押す +0
PHPzhong

ブレークポイント デバッグで次のコンテンツを監視します:
a
&a
a+0
a[0]
&a[0]

上記の問題については、まず次の 3 つのことを知っておく必要があります。
(1) 2 次元配列は 1 次元配列である
これは、アドレスが順番に出力されることを示す良い証明です。すべて継続的です。言うことはありません。
(2) 配列アドレスとは何ですか?
1 次元配列から開始しますint b[2]。配列アドレスは配列名のアドレスです。たとえば、&b は配列アドレスです。
2 次元 int a[2][2]、a は 2 次元配列名、&a は 2 次元配列アドレス、a[0] は最初の行 (最初の行と呼びます) の配列名、&a [0]は1行目の配列の配列アドレス、同様にa[1]、&a[1]はそれぞれ2行目の配列名と配列アドレスです。
(3) 配列名はポインタに変換できます
まず、ここでの b はポインタではありません。 int b[2] 内の a もポインタではありません。 a と b はポインタに変換できますが、変換できるという意味ではありません。int が短いと誰が言ったのでしょう。 int a[2][2]

コードがなぜこのようになっているかを理解するには、型を直接監視するのが最善の方法です。

a[0]とbの型に注目してください。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート