rokiの戯言

コミュ障のコンピュータオタクがなんかほざきます。

ブログ移行します。

大して記事も書かないうち一年が経ち、もう半年ほど更新していなかったわけですが、ようやく重い腰を上げてテコ入れをすることにしました。

 

元々、独自ドメインを取ってレンタルサーバを借りてブログやHPをやってみたいと思っていたのですが、なんとなく億劫で手をこまねいていました...

しかしbut however... 大学のテストが終わったこともあり、なんとなくモチベーションが上がったので一日かけて新しくブログを開設しました!!

 

新ブログ「mittBloghttp://sayahamitt.net/

 

さらに、Twitterアカウントも色々とごちゃごちゃしていたのでブログ移行に伴って新しいものを作りました。@sayahamitt です。

roki0gjmの方は鍵運用にしてフォロワーを整理しようと考えていますのでフォロワーの皆様に於かれましてはフォロー替えをお願いします。

Plextor M5S 導入!!

どもども~ 例年より梅雨明けが早かった所為でとんでもない猛暑が続いていますね;;

 

さて、先週ごろから数カ月ぶりにMS FSXを引っ張り出してきてPCにインストールして遊んでいます。時々すごくやりたくなるんですよねww

しかしこのゲーム、地球上どこへでも行けるというリアリティ故にデータがとても大きいんです;;

素の状態で20Gbyteくらい、好きなアドオンを追加していくと30Gbyteは下りません(´・ω・`)

 

私は システムドライブは128GbyteのSSDで十分だ!! というスタンスでCrucial M4 128Gbyte を使っていたのですが、諸環境やらゲームやらをインストールしていくとジワジワとシステムドライブの使用量が増えていき、結局は残り容量を気にしてゲームをアンインストールしたりまた入れ直したりを繰り返していました。

まぁ何度も同じデータを書いたり消したりするというのは、SSDだと寿命の無駄使いだし、そもそも面倒くさいものです(-3-)

 

そんな風に思っていたところに某PCパーツショップの値引き情報が入ってきたので勇んで秋葉原へ散財しに行って来ました。

 

今回の散財はコレです

続きを読む

配列、文字列、ポインタは同じものってことでいいのね?

C++見習いのrokiです。

のらりくらりとプログラミングの勉強をしている今日このごろ、ごくごく当然の事に気がついたので備忘のために書いておきます。

色々間違ったことをホザイているかもしれないので検索で辿り着いてしまった方はそのつもりで読んで頂きたいしだいです。

 

で、何に気がついたかというと。

配列も文字列も、要するにポインタってことでしょ。って話。

ポインタを理解するあたりまで勉強が進むと、ポインタ絡みの色々な事が頭のなかでごちゃまぜになって逆に解らなくなってしまった、という人もいるかと思います。

自分が正にそのパターンであるわけですが;;;

 

さて本題です。文字列の配列を作るときは

char* foo[2] = {"foo","bar"};

と宣言、初期化するわけですが。ポインタと配列と文字列の合わせ技になっていて結構複雑です。この時、配列変数はメモリ上に連続して確保した変数群の先頭のメモリアドレスを指す事と、文字列は文字の配列として表されているという点に注目します。

 

まず文字列、C/C++に置いて文字列とは文字型変数の配列として扱われます。

char* a="hello";

char b[6]={'h','e','l','l','o',0}; //0はターミネータ

と同じであるということです。

 

次に配列変数について、配列変数とは変数の型に必要な分のメモリ領域が指定された要素の数だけ連続的に確保されたものです。

上の例ではchar型の変数が6個確保されるので

f:id:roki0gjm:20130603141329p:plain

という具合に、メモリ上に48bitの領域が連続して確保されるわけです。

配列変数の名前(上の例では b )はコードの中で最初の要素のアドレスを指すポインタの役割を果たします。

char b[6]={'h','e','l','l','o',0};

cout<< b <<endl;

とすると、メモリアドレスが表示されると思います。

このアドレスは配列の先頭の要素のメモリのアドレスです。

配列変数はポインタである。これが重要です。

  • 文字列はchar型の配列変数
  • 配列変数はポインタ

この二点を押さえると最初の疑問の答えが出ます。

char* foo[2] = {"foo","bar"};

これは、配列変数fooの中に文字列型の配列変数が2つ格納されてるのです。

つまり上の宣言は

char foo[2][4] = {

                            {'f','o','o',0} , {'b','a','r',0}  //0はターミネータ

                           };

と書き換えられます。

そして"foo"というのは

配列 {'f','o','o',0} の先頭の要素を表すポインタの役割になります。

つまり、char型 8bit のメモリ領域を指すポインタです。

このポインタがさらに配列に格納されるので、一番上の配列の型はchar* になるわけです。

 

まとめると、配列も文字列もポインタなので、文字列を格納する配列変数の型はchar* になる。と言うことです。

 

きっとどこかに誤りのある記事なので、見つけたらコメントで指摘していただけると嬉しいです。

 

ではではノシ〜