3

ポインタがメモリアドレスを指すことを知ったので、それを使用してそのアドレスに設定された値を変更できます。このように:

int *pPointer = &iTuna;

pPointerここには のメモリアドレスがありiTunaます。したがってpPointer、 の値を変更するために使用できますiTuna。印刷pPointerするとメモリアドレスが印刷され、印刷*pPointerすると値iTunaが印刷されます

今この番組を見て

    char* pStr= "Hello !";
cout<< pStr << endl;
cout<< *pStr << endl;
system("PAUSE");
return 0;

私がここで理解していないことがたくさんあります:

  1. 「こんにちは!」で 各文字は別々に格納され、ポインタは 1 つのメモリ アドレスを保持します。では、どのようpStrにすべての文字を指していますか。

  2. また、印刷するpStrHello !が印刷されます。、メモリアドレスではありません。

  3. そして、印刷する*pStrと、指しているすべてのものではなく、 Hのみが印刷されます。pStr

私は本当に理解できません。これらは私の懸念事項です。誰かがこれがどのように機能するかを説明してくれることを願っています

4

7 に答える 7

10
  1. "Hello !"typeと valueの配列です。最初の要素へのポインタです。その最後の要素の値は です。char const[8]{ 'H', 'e', 'l', 'l', 'o', ' ', '!', 0 }pStr0

  2. iostreams ライブラリにはchar const *引数のオーバーロードがあり、引数を配列の最初の要素へのポインターとして扱い、ゼロに遭遇するまですべての要素を出力します。(口語用語で「ヌル終了文字列」。)

  3. 配列の最初の要素へのポインターを逆参照すると、配列の最初の要素、つまり'H'. これは と同じですpStr[0]

于 2012-08-03T15:04:14.647 に答える
2

1-)pStrを指しているためchar、実際には a の配列の先頭を指しています。null terminated string

2-)coutchar *引数でオーバーロードされています。に到達するまで、文字列内のすべての文字を出力します。null character

3-) 文字配列の最初の要素へのポインターを逆参照しています。

于 2012-08-03T15:06:19.600 に答える
1

ポインターに関するあなたの理解はあらゆる点で正しいです。

あなたの問題は、ストリームのさまざまなデータ型に対して << 演算子がオーバーライドされていることです。そのため、標準ライブラリの作成者は、演算子 << に char * 型の任意の変数に対して特定の処理を実行させました (この場合、特定の処理とは、文字列マーカーの末尾に到達するまでそのアドレスに文字を出力することを意味します)。あなたはそれを期待しています(10進数または16進数でアドレスを出力してください)

同様に、char の << 演算子は 1 文字だけを出力するようにオーバーライドされています。少し考えてみると、*pStr は文字への逆参照ポインターであることがわかります。つまり、char です。したがって、単に出力します。単一の文字。

于 2012-08-03T15:05:56.353 に答える
1
  1. ポインタは*pStr、特定のメモリ アドレスを指しますが、そのメモリ アドレスは、単一の要素、つまり としてだけでなく、そのような要素の配列charの先頭、またはメモリのブロックとしても使用できます。

  2. char配列は、一部の操作が特定の方法 (文字列として) で処理するという点で、C の特殊な配列です。したがって、 a が指定された場合、文字列を検索し、終了文字までのすべての文字を出力する必要があることprintf("%s", ...cout知っています。さらに、C は、文字列などを操作するために設計された関数を含む文字列ライブラリを提供します。char *nullchar *

  3. この動作は、独自の分析から予想されるとおりです。逆参照pStrは、単にメモリ アドレスの値を提供します。この場合はchars、メモリ内の配列の最初の要素です。

于 2012-08-03T15:12:46.940 に答える
1
  1. 文字列の概念も理解する必要があります。C および C++ では、string はメモリ内に次々と配置されるいくつかの文字 (char) であり、基本的には 'H'、'e'、'l'、'l'、'o'、'\0' です。ポインターは最初のシンボルのメモリ アドレスを保持し、C++ ライブラリは、文字列がこのアドレスから始まり '\0' で終わるすべてであることを認識しています。

  2. char* を cout に渡すと、cout は文字列を出力したことを認識し、文字列として出力します。

  3. 構築 *pStr は、「pStr に格納されているアドレスにあるものは何でもください」という意味です。それは char - 単一の文字 - 'H' で、これが cout に渡され、1 文字だけが出力されます。

于 2012-08-03T15:08:26.877 に答える
1

1-)「こんにちは!」各文字は別々に格納され、ポインタは 1 つのメモリ アドレスを保持します。では、pStr はどのようにしてすべての文字を指すのでしょうか。

文字はこの順序で各メモリ セルに格納され、末尾を示すために 0 を保持する追加の最終セルがあります。

2-)また、pStrを印刷すると、Hello !が印刷されます。メモリアドレスではありません。

cout <<文字列を指していることを理解し、文字列を出力します。

3-) そして、*pStr を印刷すると、pStr が指しているすべてのものではなく、H のみが印刷されます。

は、その*アドレスの値を求めていることを意味します。 cout << アドレスが char を保持していることを認識しているため、char を出力します。

于 2012-08-03T15:04:32.173 に答える
0
  1. 配列へのポインター (C スタイルの文字列は char の配列です) は、配列の最初の要素への単なるポインターです。

  2. << 演算子は、char* 型を C スタイルの文字列として扱うためにオーバーロードされているため、char* を渡すと、指定したポインターから開始し、次の文字を見つけるために 1 を追加し続けます。文字列の終わりを示すヌル文字を見つけます。

  3. ポインターを逆参照すると、ポインターは実際には配列の最初の項目のみを指しているため、取得する型は char になります。char に対する << のオーバーロードは、それを文字列としてではなく、1 つの文字として扱います。

このような文字列の使用は C スタイルのコードです。C++ を使用する場合は、代わりに std::string を使用する必要があります。はるかに使いやすいです。

于 2012-08-03T15:08:01.203 に答える