C 文字列 新しいページはコチラ
提供: yonewiki
(→文字列) |
|||
180行: | 180行: | ||
cout関数とprintf関数とでは出力指示が異なるために違う結果になるわけです。アドレスそのものを出力するのがアドレス演算子の役割であり、<br /> | cout関数とprintf関数とでは出力指示が異なるために違う結果になるわけです。アドレスそのものを出力するのがアドレス演算子の役割であり、<br /> | ||
一方で文字列配列のアドレスを意味する形でcStr1であるだとか&cStr1[0]のように文字型のアドレスを渡されたら文字列を出力する。<br /> | 一方で文字列配列のアドレスを意味する形でcStr1であるだとか&cStr1[0]のように文字型のアドレスを渡されたら文字列を出力する。<br /> | ||
− | + | ということですから、<br /> | |
文字型の配列になっていない1文字だけが格納されている文字変数のアドレスを出力すると\0が無いので、以下のように使用すると不具合がおこります。<br /> | 文字型の配列になっていない1文字だけが格納されている文字変数のアドレスを出力すると\0が無いので、以下のように使用すると不具合がおこります。<br /> | ||
<syntaxhighlight lang="cpp"> | <syntaxhighlight lang="cpp"> | ||
190行: | 190行: | ||
std::cout << "cout pcChar ="<< pcChar << "\n"; | std::cout << "cout pcChar ="<< pcChar << "\n"; | ||
std::cout << "cout *pcChar ="<< *pcChar << "\n"; | std::cout << "cout *pcChar ="<< *pcChar << "\n"; | ||
+ | std::cout << "cout &pcChar ="<< &pcChar << "\n"; //アドレスが表示されるけど、pcCharのアドレスではなく、pcCharのアドレスを | ||
+ | //格納しているアドレス。 | ||
+ | std::cout << "cout pcChar addr ="<< (void*)pcChar << "\n"; | ||
printf("printf %s pcChar =%s\n", pcChar); | printf("printf %s pcChar =%s\n", pcChar); | ||
printf("printf %c *pcChar =%c\n", *pcChar); | printf("printf %c *pcChar =%c\n", *pcChar); | ||
200行: | 203行: | ||
cout pcChar =aフフフフフフフフフフフフ | cout pcChar =aフフフフフフフフフフフフ | ||
cout *pcChar =a | cout *pcChar =a | ||
+ | cout &pcChar =0013FAD0 | ||
+ | cout *pcChar addr =0013FA2B | ||
printf %s pcChar =aフフフフフフフフフフフフ | printf %s pcChar =aフフフフフフフフフフフフ | ||
printf %c *pcChar =a | printf %c *pcChar =a | ||
207行: | 212行: | ||
printf関数でアドレスを引数にpcCharとして%c書式でで出力しようとするとおそらくアドレス番号の<br /> | printf関数でアドレスを引数にpcCharとして%c書式でで出力しようとするとおそらくアドレス番号の<br /> | ||
下位1バイトの文字コードが動かすたびに割り当てられるアドレスが異なるのでランダムに出力されるでしょう。<br /> | 下位1バイトの文字コードが動かすたびに割り当てられるアドレスが異なるのでランダムに出力されるでしょう。<br /> | ||
+ | x64(64bitPC)もx32(64bitPC)もリトルエンディアンという方式で値を格納しているので、32bitアプリの4byteで構成されるpcCharには<br /> | ||
+ | 上記の例で言うと先頭のアドレスには2Bが格納されています。これを%cで出力するということは、2B以外をそぎ落とした形で処理され<br /> | ||
+ | 文字コードの2Bに相当する"+"プラス記号が表示されます。 | ||
C言語の文字列という話だけで、ここまで掘り下げて理解してたら日が暮れる。<br /> | C言語の文字列という話だけで、ここまで掘り下げて理解してたら日が暮れる。<br /> | ||
+ | Char型でアドレス変数である pcCharをCout関数で出力すると文字列として出力しようとしますから、アドレスを表示する場合には<br /> | ||
+ | (void*)pcCharとして、ポインタ型にキャストすることで、アドレスが表示がされます。<br /> | ||
<br /> | <br /> | ||
疲れますよね。VBとか、JAVAとか、Perlとか、こんなことしなくてもプログラムできるのに。<br /> | 疲れますよね。VBとか、JAVAとか、Perlとか、こんなことしなくてもプログラムできるのに。<br /> |