2016-12-21 20 views
4

このコードスニペットの最後の行を理解できますか?私はそれが2D配列を動的に割り当てる方法を理解していません。私は6行目で 'a'という名前のポインタを作成し、 'c'で定義されているサイズ5の整数の配列を指していることを理解しています。ダイナミックメモリ割り当てを使用した2D配列の理解

私が理解していないのは、 "新しいint"ステートメントが、式にスローされたrとどのように機能するかです。前もって感謝します。

#include <iostream> 
const int c = 5; //num of columns 

int main() { 
    int r = 5; 
    int (*a)[c]; 
    a = new int[r][c]; // allocate array 
} 
+0

最初の段落の最後の句が間違っています。 'a'は' int'の配列へのポインタであると宣言されます。 *それでおしまい*。それは何かを指していない*(まだ)。それが 'new []'のためのものです。 – WhozCraig

+0

2D配列は、それぞれが(あなたの場合はintの)別の配列を指すポインタの配列へのポインタです。 – Ripi2

+0

'int r = 5'の後にセミコロンを忘れた – NonCreature0714

答えて

2

あなたがタイプTを持っており、サイズNの配列を割り当てしようとしている場合、この表現

new T[N] 

はのタイプT *のアドレスを返します。割り当てられた配列の最初の要素Tはint型と同等であれば

だから、例えば

T *a = new T[N]; 

を書くべき

typedef int T; 

またはその後、上記の割り当てが書き込むことができます

using T = int; 

int *a = new int[N]; 

アレイの要素のサイズはsizeof(int)に等しく、通常は4バイトです。

int[M]の要素の配列を割り当てようとしているとします。ここで、Mは定数の整数式です。

あなたは、あなたは、各要素が大きsizeof(int[M]とポインタaポイントにしていN要素の配列を割り当てられ

typedef int T[M]; 

または

using T = int[M]; 

T *a = new T[N]; 

を書くことができます配列の最初の要素。

Tが同等TP int [M]であるため、この文はタイプint[M]と割り当てられた配列の最初の要素のアドレスを取得aポインタのN要素の配列を割り当てている

int (*a)[M] = new int [N][M]; 

を書くことができます。

のint R = 5 INT(* A)[C]プログラムの例に戻っ

。 a =新しいint [r] [c];

あなたはこの文で次のよう

typedef int T[c]; 

または

using T = int[c]; 

T *a = new T[r]; 

はタイプint[c]r要素(オブジェクト)の配列を割り当て、それを書き換えることができますaはポインタです割り当てられた配列の最初の要素に追加します。

0

要素にアクセスするために2つのインデックスが必要な1次元配列へのポインタを作成するだけです。何もクレイジーではありません。

#include <iostream> 
const int c = 5; //num of columns 

int main() { 
    int r = 5; 

    //Creates a pointer to an array of 5 integer pointers. 
    int (*a)[c]; 

    a = new int[r][c]; // allocate array 

    std::cout << *a << std::endl; 
    std::cout << a << std::endl; 
    std::cout << std::endl; 
    std::cout << "Displaying deferenced, unallocated array." << std::endl; 
    for(int i=0; i<c;++i){ 
     std::cout << *a[i] << std::endl; 
    } 

    std::cout << "Diplaying pointers in the array." << std::endl; 
    std::cout << "Note how it's not a 2d array." << std::endl; 
    for(int i=0;i<c;++i){ 
     for(int j=0;j<r;++j){ 
      std::cout << a[i] << " "; 
     } 
     std::cout << std::endl; 
    } 


    std::cout << "Allocating array 1d, 1d style fails..." << std::endl; 
    /* 
    for(int i=0;i<c;++i){ 
     a[i] = 23; //Syntax error! Requires two indexes. 
    } 
    */ 

    std::cout << "Allocating 1d array 2d style... success!?" << std::endl; 
    for(int i=0;i<r;++i){ 
     for(int j=0;j<c;++j){ 
      a[i][j] = 13; 
     } 
    } 

    std::cout << "Displaying allocated array." << std::endl; 
    for(int i=0;i<r;++i){ 
     for(int j=0;j<c;++j){ 
      std::cout << a[i][j] << " "; 
     } 
     std::cout << std::endl; 
    } 


    delete [] a; 
} 

出力:

0x100202ba0 
0x100202ba0 

Displaying deferenced, unallocated array. 
0 
0 
0 
0 
0 
Diplaying pointers in the array. 
Note how it's not a 2d array. 
0x100202ba0 0x100202ba0 0x100202ba0 0x100202ba0 0x100202ba0 
0x100202bb4 0x100202bb4 0x100202bb4 0x100202bb4 0x100202bb4 
0x100202bc8 0x100202bc8 0x100202bc8 0x100202bc8 0x100202bc8 
0x100202bdc 0x100202bdc 0x100202bdc 0x100202bdc 0x100202bdc 
0x100202bf0 0x100202bf0 0x100202bf0 0x100202bf0 0x100202bf0 
Allocating array 1d, 1d style fails... 
Allocating 1d array 2d style... success!? 
Displaying allocated array. 
13 13 13 13 13 
13 13 13 13 13 
13 13 13 13 13 
13 13 13 13 13 
13 13 13 13 13 
Program ended with exit code: 0 
関連する問題