“RUN” それは魔法の言葉

私とコンピュータの思い出を、だらだらと綴ります。

34.C言語 その2

※ 今回の内容は、技術的に解釈を間違えている可能性があります。
  C言語の勉強をしている人は、別のちゃんとしたサイトをお勧めします。

この前のエントリーでも書いた通り、卒業研究は、フローチャートから、C言語のソースを生成するジェネレータ(というには恥ずかしい代物だったが…)を、Turbo Cで開発することなった。
データ構造を担当していた私。複雑なフローチャートでなければ、二分木構造を使えば実現できると考えた。(この辺はGoogle先生に聞いてねw)

二分木は、その名の通り、二方向に枝が伸びていくようにデータをつないでいくアルゴリズム。普通は検索を早く行うための考え方の一つ。
これをC言語で実現するには、構造体を使う。誤解を承知で言うと、変数の塊を自分で定義するものと、ポインタと呼ばれる仕組みを組み合わせる。
このポインタ、C言語のプログラミングで最もハードルが高いと言っても過言ではない。
簡単に言うと、変数の住所(アドレス)を知ってるのがポインタ。
その場所に何のデータがあるかは、知らなくていい。この概念が理解できるまで、なかなか…。
例えばこんな感じ。

#include <stdio.h>

void main() {
    int a;
    int *pos; /* int型のポインタ */

    a=1;
    pos = &a; /* ポインタに変数aのアドレス(&a)を代入する */

    printf("a=%d\n",a); /* aの値を参照 */
    printf("pointer a=%d\n",*pos); /* posのアドレスにある値を参照 */
}

同じ実行結果のように見えるけど、片方は変数がaであるかを知らずに、int型の変数の値が格納されたアドレスをもとに直接メモリの中身を見ている。
サンプルのような使い方は普通しないけど、ポインタを使えば変数のコピーが発生せず、メモリの消費や、プログラムの速度低下を抑えられる。
そして、二分木のような構造は、配列変数とかでもできるけど、間に挿入したり、削除したりするときに、前後のデータとのつながりをポインタの接続先を変えるだけで済むので、効率がいい。

C言語は、メモリの確保と解放が超重要。BASICだと自動的にメモリがなくなれば、エラーで止まるけど、C言語だと管理がちゃんとしていないと、アセンブラと同じようにメモリ破壊を起こして、暴走するプログラムになる。
それでも、BASICとは段違いに実行速度が速いプログラムが作れるから、楽しみながら開発(この頃はそう思っていたが、ずいぶんと低レベルだったw)できた。

<余談>
卒論は最後に、クラス全員の前で発表するんだけど、担当の教授に不幸ごとがあり、当日は居ない。さらにプレゼンの資料作成はしたものの、リハーサルもチェックもなし。ぶっつけ本番で発表したのだが、まぁグダグダに…ほかの教授からの質問にもグダグダな内容で答えてたなぁ。よく卒業できたもんだw