C ++ / Cプログラム、アレイは、静的メモリ(例えばグローバル配列として)作成されるか、またはスタック上に作成します。配列名は、メモリ、そのアドレス及び寿命中の容量(代わりにポインティングの)に対応するアレイの内容のみを変更することができ、同じままです。ポインタは、それが「可変」によって特徴付けられる、任意の時点でメモリブロックのいずれかのタイプを指すことができるので、我々は、ダイナミックメモリ動作へのポインタを使用します。ポインタの配列より柔軟なだけでなく、より危険。
ポインタと配列の比較例列の次の特性。
まず、内容を変更します
1 文字 A [] = "こんにちは"; // "こんにちは"、一定のメモリ領域に配置され、aはグローバル(静的)初期領域である 2 A [ 0 ] = ; 'X-' 。3 COUT A << << ENDL; 4 CHAR * P =「世界」; // 文字列定数は、P Pによって指さグローバル(静的)ゾーンの初期化であることに留意されたい 。5 P [ 0 ] =「X-」; // コンパイラはエラー文字列定数の内容を見つけることができませんを変更することはできません 6 COUT P << << ENDL。
第二に、比較の内容をコピー
1つの // アレイ... 2 チャー A [] = " こんにちは" ; //グローバル(静的)が一定ストア内の記憶領域を"hello"を初期化する 。3 チャー B [ 10 ]; // B初期化されていないグローバル(静的)店 4。 strcpyの(B、A); // ないA = Bと、 5 IF(のstrcmp(B、A)== 0)// そうでない場合(==のB)と 6 ... 7。 // ポインタ... 8 INT LEN = STRLEN(A)、 図9 のchar *のP =(チャー *)のmalloc(はsizeof(CHAR)*(LEN + 1。)); // p個のアプリケーションがメモリの容量を与えなければならない 10。strcpyの(P、A)// Pを使用していない=; //割り当て 。11 IF(のstrcmp(P、A)== 0)// 使用していませんもし(P == A)//後者はアドレス比較器である場合には 12 ...
配列名は、直接コピーと比較することはできません。あなたは配列にBを配列の内容をコピーしたい場合は、ステートメントが使用することはできません b = a
それ以外の場合は、コンパイルエラーが生成されます。あなたは、標準ライブラリ関数を使用する必要がありstrcpy
、レプリケーションのために。同様に、Bは使用することができない、同じであるの内容を比較しif(b==a)
、標準ライブラリ関数で決定されるべきであるstrcmp
比較。
声明では、 p = a
ポインタpの内容をコピーすることはできませんが、Pのアドレスを割り当てます。コンテンツをコピーするには、まずライブラリ関数を使用することができるmalloc
のpの容量を申請しstrlen(a)+1
、その後-characterメモリ、およびstrcpy
文字列のコピー。同様に、文はif(p==a)
内容ではなくアドレスが比較ライブラリ関数を使用する必要がありますstrcmp
比較することを。
第三に、計算されたメモリ容量
演算子を使用してsizeof
アレイ(バイトの数)の容量を算出することができます。次の例では、sizeof(a)
値が(「」忘れないでください)12です。ポインタPを指すが、sizeof(p)
値は4です。ためであるsizeof(p)
と同等のポインタ変数のバイトの数を得るためsizeof(char*)
ではなく、p個のメモリの意味の範囲内で、。C ++ / C言語は、アプリケーションメモリの時にそれを覚えていない限り、ポインタのメモリ容量を知る方法がありません。
1 のchar [] = " Hello Worldの" ; 2 のchar * p = 。 3 COUT << のsizeof(A)<< ENDL。// 12字节 4 COUT << のsizeof(P)<< ENDL。// 4字节
アレイは自動的にポインタの同じタイプに低減される場合、配列がパラメータとして渡されたときことに留意されたいです。次の例では、関係なく、どのくらいの配列aの容量、のsizeof(a)
常に等しいですsizeof(char *)
。
1 空隙のFunc(char型 [ 100 ]){ 2 COUT << のsizeof(A)<< ENDL; // 4バイトの代わりに100バイト 3 }
第四に、それはポインタ引数を渡す方法です
パラメータは関数へのポインタである場合は、動的メモリを適用するためにポインタを使用することを期待していません。次の例では、文のテスト機能はGetMemory(str, 200)
行わないstr
メモリを得ようと、str
まだNULL
、なぜ?
1 空隙 GetMemory(チャー * pを、INT NUM){ 2 P =(チャー *)のmalloc(はsizeof(CHAR)* NUM); Pのスタックの一時的なコピーとして割り当て//最初P_、P_ポインティングP、P =(CHAR *)はmalloc(サイズ(CHAR)* NUM)、 実際のメモリを変更するためには、P_を指摘
今P_すなわちmallocの新しく割り当てられたヒープメモリ監督//。しかしPは変わっていません。そう関数GetMemory出力しないもの、及び各全く自由落下があるため、GetMemoryにメモリリークを実行する
@ P_メモリヒープが開かない 。3 } 4 ボイド試験(ボイド){ 5 CHAR * STR = NULL ; 6 GetMemory(STR、100); //STRまだNULL 7 のstrcpy(strの、" こんにちは"); // 実行エラー 8 }
あなたが適用するメモリポインタパラメータを使用している場合は、「ポインタへのポインタ」を使用する必要があり、例を参照してください。
1 空隙 GetMemory2(チャー ** P、INT NUM){ 2 * P =(CHAR *)はmalloc(はsizeof(CHAR)* NUM); //受信ポインタがポインタである場合、即ち、メモリ領域、格納ポインタの値は、メモリの別の領域を指します。これは、ヒープ新しいメモリに割り当てられたPのためのものである 。3 } 4 ボイド(Test2をするボイド){ 5 CHAR * STR = NULL; 6 GetMemory2(&STR、100); // 引数は&STR、代わりSTR STRに位置していることに注意してくださいスタック上のポインタ、およびSTRはポインタであり、スタック上をstrへのポインタを割り当てます。 。7 strcpyの(STR、" こんにちは" ); 8 COUT << STR << ENDL。 9 10 フリー(STR)。 11 }