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

提供: yonewiki
移動: 案内, 検索
(文字列配列)
(文字列配列)
97行: 97行:
 
絵には少し嘘が入っていて、0133E410はリトルエンディアンという方式が採用されているせいで実際には逆順に10,E4,33,01と格納されてます。<br />
 
絵には少し嘘が入っていて、0133E410はリトルエンディアンという方式が採用されているせいで実際には逆順に10,E4,33,01と格納されてます。<br />
 
リトルエンディアンの思想が紛らわしいのでとりあえず、順番に書いておきました。<br />
 
リトルエンディアンの思想が紛らわしいのでとりあえず、順番に書いておきました。<br />
 +
それで、下側の方にあるアドレス0133E410の先頭からyonewikiと順番に格納されています。<br />
 
そうすると<br />
 
そうすると<br />
 
<syntaxhighlight lang="cpp">
 
<syntaxhighlight lang="cpp">
112行: 113行:
 
なんだよppcStrって配列宣言してないのに、配列なのかよ。って思う人もいるかもしれません。<br />
 
なんだよppcStrって配列宣言してないのに、配列なのかよ。って思う人もいるかもしれません。<br />
 
ポインタは配列のように指定することができて、この表記は<br />
 
ポインタは配列のように指定することができて、この表記は<br />
ppcStr[i]から*(ppcStr+i)と書き換えることができます。これがポインタであり配列なのです。他の型でもこれは同じことです。<br />
+
ppcStr[i]から*(ppcStr+i)と書き換えることができます。<br />
ここではiが1増える都度、アドレスの大きさである4Byte分が大きくなって表示されます。これのアドレスが移動している様(中身)を見たい場合は<br />
+
<br />
 +
(void*)ppcStr[i]というアドレスの中にに書かれたアドレスを<br />
 +
ppcStr[i]や*(ppcStr+i)で指定しアドレスを指し示す。<br />
 +
<br />
 +
これがポインタであり配列なのです。他の型でもこれは同じことです。<br />
 +
ここではiが1増える都度、アドレスの大きさである4Byte分が大きくなって表示されます。<br />
 +
これのアドレスが移動している様(中身)を見たい場合は<br />
 
(void*)*(ppcStr+i)<br />
 
(void*)*(ppcStr+i)<br />
 
とすると良いです。<br />
 
とすると良いです。<br />
 +
<br />
 
ここで、まだ理解ができていな人向けに説明しておくと<br />
 
ここで、まだ理解ができていな人向けに説明しておくと<br />
char **ppcStr;で定義したときはアドレスのアドレスのための変数でありなが、逆に、これを処理の中に記述すると<br />
+
char **ppcStr;で定義したときはアドレスのアドレスのための変数でありながら、<br />
 +
逆に、これを処理の中に記述すると<br />
 
**ppcStrはppcStrに格納されているアドレスが指し示す中身の中身という意味になることです。<br />
 
**ppcStrはppcStrに格納されているアドレスが指し示す中身の中身という意味になることです。<br />
 
したがって、**(ppcStr)は'y'を示します。<br />
 
したがって、**(ppcStr)は'y'を示します。<br />
 
printf("%c",**ppcStr);<br />
 
printf("%c",**ppcStr);<br />
 
但し、厳密には以下のような記述が良いでしょう。<br />
 
但し、厳密には以下のような記述が良いでしょう。<br />
printf("%c",*(*(ppcStr + 0) + 1));で'o'と確認できます。なぜならここで3つ定義した文字列リテラルはメモリアドレスの中で連続して配置されているとは限らないからです。<br />
+
printf("%c",*(*(ppcStr + 0) + 1));で'o'と確認できます。<br />
 +
なぜならここで3つ定義した文字列リテラルはメモリアドレスの中で連続して配置されているとは限らないからです。<br />
 +
カッコを使って増やすアドレスを増加させる対象をわけておくのがいいでしょう。一番内側のカッコ内が<br />
 +
"yonewiki","mediawiki","google"の3つの要素を移動するためのアドレスを格納するのに必要な4Byteでの移動量を意味しています。<br />
 +
外側がChar型変数の大きさ1Byteでの移動を意味しています。<br />
 +
ポインタのポインタを使った場合でも2つの指定しなければならない値があることで、2次元配列になっていることが実感できたと思います。<br />
 
興味本位で数字を増やして全部確認していくも良いですが、\0が表示されたらそこで処理を止めないと<br />
 
興味本位で数字を増やして全部確認していくも良いですが、\0が表示されたらそこで処理を止めないと<br />
 
未定義の領域をポインタで参照することになり違反となります。<br />
 
未定義の領域をポインタで参照することになり違反となります。<br />
 
printf("%c",*(*(ppcStr + 1) + 0));なら"mediawiki"の先頭の'm'が表示されます。<br />
 
printf("%c",*(*(ppcStr + 1) + 0));なら"mediawiki"の先頭の'm'が表示されます。<br />
 
 
<br />
 
<br />
 +
より理解を深めるためには、<br />
 
ポインタと配列を勉強しなおさないとダメですね。またそれは別の項目で記載します。<br />
 
ポインタと配列を勉強しなおさないとダメですね。またそれは別の項目で記載します。<br />
 
<br />
 
<br />
 
[[C PlusPlus|C++]]へ戻る
 
[[C PlusPlus|C++]]へ戻る

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



個人用ツール
名前空間

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