2016-12-15 6 views
2

私はC++を初めて使い、2D配列に対してどのようにメモリが割り当てられるかを理解しようとしています。C++での2D配列のメモリ割り当て

answer1

answer2

これらの答え連続メモリの割り当ては、同様に、通常の配列のためのような2次元配列のために起こることを言います。私はそれが私の予想外の結果が得られることをやろうとしているとき、*(array + (i * ROW_SIZE) + j)

を使用してarray[i][j]番目の要素にアクセスすることができるはずですが2言及回答(私が間違っているなら、私を修正)。

コード:

#include <iostream> 
#include <string> 

using namespace std; 

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

結果:

0x76e1f4799008 
2012576581 

それは私array[i][j]番目の要素を与えるものではありません。その解決法が間違っているかどうか、あるいは私が以前の答えを誤解しているかどうか、何が起こっているのかを説明することができますか?

答えて

3

まず2Dのポインタであります

std::cout << *(p + 1*2 + 1) << std::endl; 
012のように、 pにインデックスを付けることができます

最初の試行がうまくいかなかった理由は、種類に関連しています。何が起こっていることは、あなたが以来

*(array + 1*2 + 1) 

を評価しようとしているあなたの最初の試みで、arrayint Sを含むタイプの「アレイ-の長-2」「アレイ-の長-2」を含むということですすなわち、(int[2])[2]これは、要素の3倍の倍数arrayで、int[2]です。 これはあなたの配列の外に飛びます。実際には*(array+3)array[3]に相当します。さて、明らかにタイプint[2]のものがあります。これは、印刷しようとするとポインタに崩壊します。あなたの2回目の試行では、これを逆参照してarray[3][0]のようなものを生成します。これは適切な型ですが、配列の外側を指しています。

3

それはあなたがこの

0 1 2 
3 4 5 
6 7 8 

等が一次元アレイのような2次元配列をシミュレートする場合などよりなるアレイは(それが*されるべきアクセス0〜4 1 2 3 4 5 6 7 8あろうa [0] +(1 * 3)+1)a [0]はa(配列の名前)と同じです。その後

int *p = &array[0][0] 

を:

1

配列を使用すると、全部の最初の要素へのポインタを取得する必要がちょうど最初の行にはない、すなわち、

**array = array[0][0] 
*(*array + j) = array[0][j] 
*(*(array+i) + j) = array[i][j] 
+0

ええ、そうですが、その解は '(array +(i * ROW_SIZE)+ j)'と等しくはありません。 '(array +(i * ROW_SIZE)+ j)'が間違っているのか、何か間違っているのかどうか知りたい。 – e11438

+0

この答えは、 '配列の配列はポインタへのポインタと同じではありません。 'http://stackoverflow.com/a/21580967/4384418 – e11438

関連する問題