2

I have a small school assignment. My output is not correct. Can you see if I'm doing anything wrong?

//1. Create a char pointer named cp
char *cp;

//2. Dynamically allocate a char and store its address in cp
char dynamicChar = 'A';
cp = &dynamicChar;

//3. Write the character 'x' into the char
*cp = 'x';

//4. Print out the value of the char using cout
cout << cp << endl;

The print out statement prints A@@ instead of just A. I'm not sure what I'm doing wrong.

4

3 に答える 3

9

試す

cout << *cp << endl;

文字へのポインターではなく、文字を印刷したい。ポインターを渡すと、coutそこから始まる文字配列を出力するように指示していると思います。

于 2011-03-06T18:10:13.043 に答える
5

悲しいことに、Cプログラミング言語の起源から、char *(つまり文字へのポインター)は、int *(intへのポインター)やfloat *(floatへのポインター)のような型への単なるポインターとして扱われませんが、多くのライブラリー関数は、これらをNUL文字で終了する文字列として扱います。「文字列」とは、テキストを意味します。

したがって、char *を特殊なケースとして扱い、それらを「ヌル終了文字列」として扱うライブラリ関数がたくさんあります。つまり、NUL文字に到達するまで、そのポインタを(つまり、複数の連続する)文字の配列として扱います。 (つまり、数値バイト値が48または0x30の文字「0」ではなく数値0)。

だから、あなたのコードにあなたが持っているなら

char *sz = "123";

これにより、4文字が割り当てられ、表示される3文字とNUL文字が割り当てられます。

Addr:0x00050014 0x31  // ASCII char '1'
Addr:0x00050015 0x32  // ASCII char '2'
Addr:0x00050016 0x33  // ASCII char '3'
Addr:0x00050017 0x00  // ASCII char nul

sz(アドレスを表す文字へのポインター)の値は0x00050014になります(開始アドレス値は、コンパイラー、リンカー、ローダー、場合によってはプログラム自体を介した複数のステップを介してコンピューターによって決定されることに注意してください) 。

これを行うと cout << sz << endl; 、プログラムは文字へのポインタをヌル文字で終了する文字のバッファへのポインタとして解釈し、文字列123を出力ストリームcoutにダンプします。アドレス0x00050014の値を調べ、そのNUL(つまり、0)がないかどうかを確認し、そうでない場合は、文字をダンプしてから、次のアドレスを調べます。0x00050015がNULでない場合は、ITをダンプします。次に、0x00050016の値は、NULではないことを確認してダンプします。次に、0x00050017に到達し、NULであることを確認し、ダンプしません。アドレスの確認を停止し、実行した直後にコードに戻ります。 szの出力、特にこのコードでは、endl(行末)をcoutにダンプするポイントに戻ります。

最終的には、古いCスタイルのchar *メカニズムよりも優れたテキスト表現方法を学習しますが、今のところは、存在する従来の動作を理解する必要があります。

于 2011-03-06T18:52:01.523 に答える
3

C++ (より具体的にはostream、この場合) は、自動的にchar*a を (C スタイルの) 文字列として扱います。次のように、必要なタイプに明示的にキャストする必要があります。

cout << (void*)cp << endl;

ポインタ値が必要な場合、または

cout << *cp << endl;

キャラクター自体が必要な場合(質問が示すように)。

于 2011-03-06T18:10:49.660 に答える