第28章 構造体とポインタ 


またまたポインターです!

第26章で予告したとおり、構造体へのポインタをやります。 その前に、構造体変数が配列になっている場合の例を示します。 これは、よく使います。是非使い方をマスターしてください。

#include <stdio.h> #define text_set(x, y) (printf("\x1b[%d;%dH", y, x)) //カーソル位置 #define clear_txt() printf("\x1b[2J") //画面消去 #define red_color() printf("\x1b[31m") //赤色に #define white_color() printf("\x1b[37m") //白色に struct name_list {//構造体テンプレート  char name[14]; char sex; int age; }; int main() { int i; static struct name_list member[] = { //構造体変数が配列 {"粂井康孝", 'M', 32}, //このような配列の初期化は {"田中一郎", 'M', 38}, //staticで {"粂井ひとみ", 'F', 36} }; clear_txt(); //マクロです printf("%-12s %2s %2s\n", "氏名", "性", "年"); for(i = 0; i <= 19; i++) putchar('-'); for(i = 0; i <= 2; i++) { text_set(1, i + 3); printf("%-12s %2c %2d", member[i].name, member[i].sex, member[i].age); } red_color(); printf("\n\n上記は、実在の人物とは関係ありません\n"); white_color(); return 0; }

これを実行すると下のようになります。

エスケープ・シーケンスとマクロの使い方も復習してください。 構造体変数が配列になっても別にどうということもないですね。

さて、今度は本題の構造体へのポインタをやります。 これも、今までの知識から類推できると思いますが 念のため例題を示して解説します。

*(ptr.name)ではなく(*ptr).nameであることに注意してください。 「*」と「.」では「.」の方が優先順位が高いからです。

こういう書き方より矢印記号(->)の方が一般的です。 矢印で指し示している(ポインタ) のでいかにも視覚的で覚えやすいですね。

どういうやり方でも、表示されるものは同じですね。(当たり前!)

さて、次は構造体変数が配列の時ですが、これもすぐに類推 できますね。上の例と同じことです。

3つの表示方法を示します。1番目はそのままですね。 2番目は、(*ptr + i).name などとするとエラーになります。 これは、演算子の優先順位を考えると当たり前ですね。 必ず (*(ptr + i)).name としてください。

実は、このサンプルプログラムを書いているとき、 ちょっとしたミスがあり、これを実行したら ハードディスクが突然ガリガリと大きな音を立て始めました。

ストップキーを押して中断できたので 実害はなかったもののヒャッとしました。 ポインタを扱うプログラムは、バグがあると とんでもないことが起こることがあります。 注意しましょう。(筆者自身に言い聞かせている)

当たり前ですが、どの方法でも表示されるものは同じです。 ほかにも、まだまだ違う方法があります。いずれ、少しずつ 小出しにしていきます。(1度に書くとあとで書くことが無くなってしまう!)


[Index][総合Index] [Previous Chapter] [Next Chapter]

Update Nov/22/1996 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。