2

アドレス、ポインター、およびアンパサンドを理解していると思っていたのに、これが起こりました。簡単な方法で配列を作成し、そのアドレスをさまざまな方法で出力しようとすると...

string textArray[5] = {"test1", "test2", "test3", "test4", "test5"};

cout << "Address of string &array: " << &textArray << endl;
cout << "Address of string array: " << textArray << endl;
cout << "Address of string &array[0]: " << &textArray[0] << endl;

予想どおり、3 行すべてが同じメモリ アドレスを出力します。しかし、最初の行を次のように変更すると

string *textArray = new string[5] {"test1", "test2", "test3", "test4", "test5"};

cout << "Address of string &array: " << &textArray << endl;
cout << "Address of string array: " << textArray << endl;
cout << "Address of string &array[0]: " << &textArray[0] << endl;

&textArray のアドレスが違います!だから私の質問はなぜですか?通常、配列では、アドレスは最初の要素への単なるポインターです。しかし、これは動的に割り当てられた配列には当てはまりませんか? &textArray から返されるアドレスは何ですか?

4

6 に答える 6

3

string textArray[5]は 5 つの文字列の配列で、string *textArrayは文字列へのポインタです。

配列名を出力すると、1 番目と 3 番目と同じアドレスを指定することで、最初の要素へのポインターに崩壊します。

ポインターの場合、その値を出力すると配列のベースアドレスが出力されますが、アドレスを出力するとポインターのアドレス自体が出力されます。同じエンティティがあるタイプから別のタイプに崩壊することはありません。ここでは、ポインタと配列は異なるエンティティです。

于 2013-11-11T11:43:33.520 に答える
0

それは読むべきです:

cout <<"Address of a pointer itself: " << &textArray << endl;
cout <<"Address of array pointed to by this pointer: " << textArray << endl;
cout <<"Address of array pointed to by this pointer: " << &textArray[0] << endl;

&textArray のアドレスが違います!だから私の質問はなぜですか?

表現だから

string *textArray = new string[5];

配列とそれを指すポインタを作成します。&textArrayこのポインタ自体のアドレスです。最初の場合に注意してください

string textArray[5]

配列をいくつかのポインターに割り当てませんでした(ただしtextArray、ポインター自体です)。もしあなたがそうするなら

string textArray[5];
string *textArrayPtr = &textArray;

次に、印刷しようとすると、2番目のケースと同じ結果の違いが表示されますtextArrayPtr

cout <<"Address of a pointer iself: " << &textArrayPtr << endl;
cout <<"Address of array pointed to by this pointer: " << textArrayPtr << endl;
cout <<"Address of array pointed to by this pointer: " << &textArrayPtr[0] ;
于 2013-11-11T11:44:57.810 に答える
0

実際、これらの印刷ステートメント

string textArray[5] = {"test1", "test2", "test3", "test4", "test5"};

cout << "Address of string array: " << textArray << endl;

string *textArray = new string[5] {"test1", "test2", "test3", "test4", "test5"};

cout << "Address of string array: " << textArray << endl;

配列は最初の要素へのポインターに暗黙的に変換され、文字列 *textArray も動的に割り当てられた配列の最初の要素を指すため、同等です。

一方、定義を使用する場合

string *textArray = new string[5] {"test1", "test2", "test3", "test4", "test5"};

次に、変数 textArray 自体に対して、コンパイラはメモリを割り当てます。動的に割り当てられた配列が占有するメモリとは一致しません。個別の記憶です。だからあなたが書くとき

string *textArray = new string[5] {"test1", "test2", "test3", "test4", "test5"};

cout << "Address of string &array: " << &textArray << endl;

変数 textArray がコンパイラによって配置されたこのメモリのアドレスの出力を取得します。

于 2013-11-11T11:47:04.390 に答える
0

*textArray配列ではなくポインタです。

&textArrayのメモリ アドレスを参照しtextArrayます。つまり、 が配置されているメモリの場所pointer textArrayです。

textArrayに格納されているデータを参照しますpointer textArray。実際には、それが指している配列の開始アドレスです。

&textArray[0]は再び のメモリ アドレスを参照しますtextArray[0]。これは、配列の開始アドレスであり、 と同じtextArrayです。

于 2013-11-11T11:47:08.560 に答える
0

変数を保存する 2 つのメモリ セクションがあります。最初のストレージはスタックで、以下のコードtextArrayではスタック ストレージに保存されます。コンパイル前にサイズが明確な変数は、スタック ストレージに保存できます。

string *textArray = new string[5] {"test1", "test2", "test3", "test4", "test5"};

2 番目のストレージは、プログラムの実行中にこのストレージを使用できるヒープです。newキーワードを使用して、このストレージからメモリを予約できます。上記のコードでは、5 つの文字列用にメモリを予約しました。deleteヒープ ストレージからメモリを予約するときは、使用が終了したときにそれを行う必要があることに注意してください。

したがってtextArray、スタックストレージに保存された変数の名前です。変数のタイプ textArrayはポインターであるため、&textArray出力を出力すると、スタックセクションに保存された変数のアドレスになります。textArray出力を印刷するtextArrayと、文字列がこのセクションに保存されたヒープセクションのアドレスである変数の値になります。 &textArray[0]コンパイラに、&(*(textArray+0))これは と同じであると伝えます。textArray

于 2015-10-28T22:13:30.757 に答える
0

「char *textArray」は配列ではないためです。これは、独自のアドレスを持つポインタです。

于 2013-11-11T11:38:30.793 に答える