それは、アルゴリズムの問題のleetcodeのでhttps://leetcode-cn.com/problems/regular-expression-matching/、必要性は、2次元配列を使用するように、偉大な理解するための独自の誤解や使用の結果は、そう、析出しますメモリと、再び徹底コーミングの他の側面から。
一次元配列
CHAR * A =(CHAR *)はmalloc(8 * はsizeof(CHAR ))。 memset(0、8 )。 用(INT iは= 0 ; I < 8 ; I ++ ) { *(+ i)は= ' ' + I。 } のための(INT iは= 0 ; I < 8 ; I ++ ) { COUT << *(+ I)。 } のために( int型私は= 0を。I < 8。I ++ ) { COUT << [I]。 } フリー(A)。
出力コンテンツabcdefghabcdefgh
そのようなアプリケーションは、[8]は、それが使用されているか、同じであるCHARまたは長さが8バイトの配列である基本的な実装は、すべて同じに関連しています。私たちは、メモリを見て、だけでなく、連続したデータの期間。
メモリを解放すると、メモリ管理システムは、この8つの連続したバイトに応じて回収することができます。
二次元配列
私たちは、通常の使用を見て
CHAR [ 8 ] [ 4 ] = { 0 }。 以下のために(INT iが= 0 ; I < 8 ; I ++ ) { ため(INT J = 0 ; J < 4 ; J ++ ) { [I] [J] = ' ' + I。 } } のために(INT iは= 0 ; iは< 8 ; I ++ ) { ため(INT J = 0 ; J < 4。J ++ ) { COUT << [I] [J]。 } }
出力aaaabbbbccccddddeeeeffffgggghhhh
私たちは、メモリを見て
連続したメモリアレイA [n]は[m]は、次数Mジャンプによれば、第1のM系列は、nの最初であり、n、およびmは、実際には一次元アレイである第二の配列、です。
私たちの最初の実装をチェック
チャー ** A =(チャー **)はmalloc(8 * はsizeof(CHAR * ))。 以下のために(INT iが= 0 ; I < 8 ; I ++ ) { *(+ I)=(CHAR *)はmalloc(4 * はsizeof(CHAR ))。 } ため(INT iは= 0 ; iは< 8 ; I ++ ) { ため(INT J = 0; J < 4。J ++ ) { [I] [J] = ' ' + I。 } } のために(INT iは= 0 ; I < 8 ; I ++ ) { ため(INT J = 0 ; J < 4 ; J ++ ) { COUT << [I] [J]。 } }
スペースアプリケーションの点である配列であり、空間は、char * 8サイズです。各アレイ素子A、及び空間を指し、空間4文字のサイズ。図メモリ空間、点Aのスペースに示すデータは、8つの要素、char型へのポインタである、char *を、保存するために使用されるスペースの各要素があり、Aは、ポインタへのポインタです。このデータは、4バイト文字に格納され、このデータはデータのブロックへのポインタに格納され、データのブロックへのポインタです。
私たちは、実際のメモリアドレスを見て
これはチャー*、CHAR *空間8のデータアレイである、最初の標準は、青色+ 0保存されたデータ、ポインタアドレスが32ビットであるため、それは翻訳、4バイトであります0X00557600です
私たちは、データポイントの最初の部分の内容を見て、それはAAAAのセーブデータの一部、4 aがあります。
これは、2次元配列の本質です。保存された文字のデータ点の一次元アレイは、データ点の二次元アレイは、ポインタの一次元配列にリスト相当に記憶され、一次元アレイの各2次元アレイ素子相当します。ように、3次元配列は、2次元配列はポインタのリストを維持しています。
それは*(+ I)によるデータへのアクセス次に、一次元アレイと、データを+ Iによるポインタの要素への最初の訪問にそれにアクセスする方法を、このデータは*により、アレイである(+ I *経て、アクセスする)+ jの要素のポインタ、アクセス(*(I +)+ j)は、最後のリマインダーは、領域を解放することを忘れないでください。
以下のために(INT iが= 0 ; I < 8 ; I ++ ) { ため(INT J = 0 ; J < 4 ; J ++ ) { COUT << *(*(I +)+ J)。 } } のための(INT iは= 0 ; I < 8 ; I ++ ) { フリー(*(+ I))。 } フリー(A)。
第2の2次元アレイの実装
チャーA [8] [4]であれば、我々は、実際には、2次元アレイを適用するために、参照、空間が連続している、我々は、アプリケーションメモリのこの部分は、効率的にシミュレートすることができません。コードは以下の通りです
CHAR * A =(CHAR *)はmalloc(8 * 4 * はsizeof(CHAR ))。 用(INTは iは= 0 ; I < 8 I ++; ) { ための(int型 J = 0 ; J < 4 ; J ++ ) { *(+ I * 4 + J)= ' ' + I。 } } のために(INT iが= 0 iが<; 8 ; I ++ ) { ための(int型 J = 0 ; J < 4 ; J ++ ) { COUT << *(i *が+ 4 + j)を、 } } フリー(A)。
一次元アレイを適用し、サイズは* [n]は[M] nを配列要素数mです。それへのアクセスは、アクセスの二次元アレイを模倣するために、mは要素の集合です。次のようにメモリ
少しは[8] [4をchar型、尋ねあり ] これはではなく、このように、アクセスを[1] [2]ことができますが。CHAR [8]二次元アレイシステムがジャンプする方法を知るために、その情報を保持することが知られている[4]、およびCHAR * A =(CHAR *)はmalloc(8 * 4 * はsizeof(CHAR ));システムが考えられているA次元配列は、そのように二次元のジャンプによれば、エラーを実行します。
malloc関数に加えて、あなたも新しい、より便利に使用することができます
CHAR * = 新しい CHAR [ 8 ]();
ここで、初期化ステップを低減する空間を作成し、サイズは8であり、単位はチャーコール()を初期化するためです。ここで()呼び出し手段既定のコンストラクタ新しい文字に等しい。[8] {}
二次元アレイの第三の方法
空間の上記の方法一緒に、しかし2次元アレイを使用してアクセスすることができない、非常に厄介な、それの動的な二次元配列が存在しない、エピソードは、上記の新規な方法を提供してくれます。
自動車Aは= 新しい CHAR [ 8 ] [ 4 ](); 以下のために(INT iが= 0 ; I < 8 ; I ++ ) { ため(INT J = 0 ; J < 4 ; J ++ ) { [I] [J] = ' ' + I。 } } のために(INT iは= 0 ; iは< 8 ; I ++ ) { 用( int型 J = 0 ; J < 4。J ++ ) { COUT << [I] [J]。 } } 削除 []();