これを実行すると下のようになります。#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度に書くとあとで書くことが無くなってしまう!)
Update Nov/22/1996 By Y.Kumei