lstrlen のこと

tchar.h をもっと有効に使ってみようということで、_tcslen, _tcscpy, _istupper, _totlowerなどを使ってみたところ、プログラムが動かなくなった。おかしいなと思い調べてみたところ、ちょっとしたことに気がついた。

lstrlenにはNULLを渡しても大丈夫だが、strlenにNULLを渡すと動かない。

そんなの当たり前だと言われるかもしれないが、何も考えずにlstrlenを使っていたので今までNULLを渡しても問題ないと思っていた。strlenにはNULLを渡してはいけない。だから_tcslenに変えると、_tcslen(NULL)となったところでプログラムが動かなくなってしまう。

NULLはきちんとチェックしてから長さを調べることにするように(自戒)。

「ポインタ」がわからない

C言語のポインタがわからない」 そう友人に言われて、私は面倒だったのでとりあえず「メモリについての知識を深めろ」と言った。

ポインタ本というのがよくあるらしいが、私はそういったものを読んだことがない。私が読んだのは『プログラミング言語C』一冊だけだ。そんな私がポインタを理解できて私よりずっと賢い友人が理解できない、というのは私には理解できない。

C言語はメモリの管理をプログラマに委ねている

まず「C言語は比較的低水準な言語である」これを言葉だけでなくしっかりと理解すべきだ。比較的低水準であるが故に、プログラマはメモリを自在に操作できる。これは長所であり、短所である。C言語はメモリの管理をプログラマに委ねている。

ポインタはアドレスが格納できる変数である

次にメモリについて理解しなければいけない。i++ の意味など最後の最後でいいのだ。メモリはトランジスタコンデンサで電気をためておくだけの箱だ。この箱は「番号を振って並べてある」。ここで言う番号がアドレスであり、ポインタはこのアドレスを格納するものである。ポインタはアドレスが格納できる変数である。

ポインタは間接的な操作が可能

ポインタはアドレスを格納するものだが、通常の変数にはできないことができる。通常、変数を書いたとき、その式の値はその変数の中身になる。だから、ポインタを書くと、その式の値はアドレスになる。アドレスしか値としてでないと、アドレスしか操作できなくなる。これは不便だ。

ポインタは「変数の中身(アドレス)」が指す「中身」を操作できる。ポインタの中身の中身を操作できる。これが「『*』であらわされるポインタの中身の中身を参照する演算子」の存在する意味だ。ポインタは間接的な操作が可能だ。

なぜ「メモリについての知識を深めろ」と言ったのか

ポインタの基本は結局これだけのことであり、これと配列や、ポインタの配列などが組み合わさることで理解がしにくくなっているだけのことだ。メモリを少し理解するだけでC言語はずっと使いやすくなる。むしろ、メモリを理解せずにC言語を理解するというのは不可能に近い。

だから、私は「メモリについての知識を深めろ」と言ったのだ。

おわり。

間接アドレッシングという言葉が不適切な気がしたので修正

macro memo

  • MAKEWORD(lo, hi)
  • LOBYTE()
  • HIBYTE()
  • LOWORD()
  • HIWORD()

Shift_JISって色々あるみたい。cp932ってのが日本語WindowsShift_JISって呼ばれてるものだってさ。ってことは、cltc は cp932で記述してることになるのかな。参考URL

DonutってVCじゃなきゃコンパイルできないのかな。

Hello C++

C++をはじめようかと思う。とりあえず宣言だけ。(そういえば、cltcにも宣言だけされて定義されていない関数があったような)

いろいろなサイトでお勧め書籍として紹介されている Effective C++ (第二版)の日本語って、もうないのかな。amazon見たら、ユーザから7850円*1〜で、となっていた。ひでー、倍の値段じゃねぇか。

*1:元の値段は3990円