悲しいことに、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 *メカニズムよりも優れたテキスト表現方法を学習しますが、今のところは、存在する従来の動作を理解する必要があります。