C 文字列 新しいページはコチラ

提供: yonewiki
移動: 案内, 検索
(文字列)
180行: 180行:
 
cout関数とprintf関数とでは出力指示が異なるために違う結果になるわけです。アドレスそのものを出力するのがアドレス演算子の役割であり、<br />
 
cout関数とprintf関数とでは出力指示が異なるために違う結果になるわけです。アドレスそのものを出力するのがアドレス演算子の役割であり、<br />
 
一方で文字列配列のアドレスを意味する形でcStr1であるだとか&cStr1[0]のように文字型のアドレスを渡されたら文字列を出力する。<br />
 
一方で文字列配列のアドレスを意味する形でcStr1であるだとか&cStr1[0]のように文字型のアドレスを渡されたら文字列を出力する。<br />
ということは、<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 />

2013年11月18日 (月) 00:00時点における版



個人用ツール
名前空間

変種
操作
案内
ツールボックス