• ベストアンサー

構造体について

凄く初歩的な質問で申し訳ありませんが… 入門書の構造体のところで 以下のようなプログラムの例がありました。 #include <stdio.h> struct seiseki { /* 構造体の宣言 */ int no; char name[20]; double average; }; int main(void) { int i; struct seiseki seito1, seito2[20]; /* 構造体変数と構造体配列の宣言 */ >char name[20] というのは、NAMEの領域を20文字 確保すると言うことですよね? >struct seiseki seito1, seito2[20] ここの箇所が分からないのですが seito2[20]の20というのは どうして20なのですか? NAMEだけではないので もっと大きな数字になるような気がするのですが… またseito1の方は どうして数字が何もないんですか? 考え違いをしているところを ご指摘して頂ければ幸いです。

  • niiza
  • お礼率43% (211/486)

質問者が選んだベストアンサー

  • ベストアンサー
  • Hardking
  • ベストアンサー率45% (73/160)
回答No.4

seiseki構造体(成績情報)の内訳項目は int no; //名簿番号 char name[20]; //名前 double averageint; //平均点 の3項目ですね。 まず、char name[20]ですが20文字の領域ではなく 20バイトの領域です。 半角文字は1文字が1バイト。 全角文字は1文字が2バイト。 次に構造体変数 seito1 seito2[20]についてですが seito1は、生徒1人分の成績情報を保持する変数です。 ┌───────┐ │ seito1 │ ├───────┤ │ no │ │ name[20] │ │ average │ └───────┘ seito2は、最大生徒20人分の成績情報を保持する変数です。 ┌───────┐ ┌───────┐ ┌───────┐ │ seito2[0] │ │ seito2[1] │ │ seito2[19] │ ├───────┤ ├───────┤ ├───────┤ │ no │ │ no │...│ no │ │ name[20] │ │ name[20] │ │ name[20] │ │ average │ │ average │ │ average │ └───────┘ └───────┘ └───────┘ 変数名に数字があるseito2を、配列変数です。 seito1は配列にする必要が無いので、変数名に数字はつきません。 以上。

niiza
質問者

お礼

大変に分かりやすいご説明 ありがとうございました こんな私でも理解することが出来ました

その他の回答 (3)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.3

変数と配列を並べて書いて、名前もseito1, seito2なので紛らわしいかも struct seiseki suzuki; /* 鈴木君の構造体*/ struct seiseki itikumi[20]; /* 1組の生徒20人分の構造体 */ なら少しわかりやすいかも

niiza
質問者

お礼

大変に分かりやすいご説明 ありがとうございました こんな私でも理解することが出来ました

  • LESQUA
  • ベストアンサー率11% (1/9)
回答No.2

ごめんなさい、速攻間違えましたm(_ _)m >としてアクセスできますが、seito2の場合では(例えば10番目の人は) 添え字は0から始まってますので10番目の人は  seito2[9].average でした。

  • LESQUA
  • ベストアンサー率11% (1/9)
回答No.1

>というのは、NAMEの領域を20文字 >確保すると言うことですよね? はい、そうです。 >seito2[20]の20というのは >どうして20なのですか? 生徒20人分のデータだからだと思います。 NAMEの20とは違った扱いになります(問題が紛らわしいですねw) struct seiseki { /* 構造体の宣言 */  int no;  char name[20];  double average; }; int main(void) {  int i;  struct seiseki seito1, seito2[50]; とかにしたほうが、混乱が少なくていいでしょう。 >またseito1の方は >どうして数字が何もないんですか? たぶん、一人の時と複数人の時の差を教えたかったのだと思います。 seito1であれば直接  seito1.average としてアクセスできますが、seito2の場合では(例えば10番目の人は)  seito2[10].average となります。

niiza
質問者

お礼

大変に分かりやすいご説明 ありがとうございました こんな私でも理解することが出来ました

関連するQ&A

  • C言語の構造体

    組込み系でマイコンにソフトをプログラミングの仕事をしています。 C言語は初心者です。 http://www9.plala.or.jp/sgwr-t/c/sec15.html のページの冒頭に、 「構造体は幾つかの異なる型のデータをまとめて 1つのデータ型として扱うものなのです。」と書かれています。 1つのデータ型として扱うとどのようなメリットがあるのでしょうか? 例えば、 struct seiseki seito1; のように対象が1つ(seito1)なら int seito1_no; char  seito1_name[20]; double seito1_average; と変数を確保すれば済むのに、 何故、構造体で宣言するのでしょうか? 例えば、 struct seiseki seito2[20]; のように、似たものが複数ある場合は(seito2が20人分なるなら、) 構造体で宣言する意味があるとはなんとなくわかります。 後ページの http://www9.plala.or.jp/sgwr-t/c/sec15-4.html では、関数でのやり取りが書かれています。 関数で引数や返値で扱うときに構造体にしておいた方が良いからでしょうか? 構造体のメリットというのが今一わかりません。 対象が1つでも構造体で書いた方がいろんな意味で良いのでしょうか? 如何せん、初心者なので質問がうまく書けませんがご了承ください。 ※上から目線的な回答はご遠慮願います。

  • 構造体のリスト

    ご質問させていただきます。 下記は拾ったソースをちょっとアレンジしたものなのですがエラーはなく動きます。 struct seiseki { int no; /* 学生番号 */ char name[20]; /* 氏名 */ double average; /* 平均値 */ }; int main(void) { int i; struct seiseki seito[20] = { { 1, "SAKURAI", 78.6 }, { 2, "NAGANO", 57.3 }, { 3, "TAKESHITA", 66.4 }, }; for(i = 0; i < 3; i++) { printf("%d %s %5.1f\n", seito[i].no, seito[i].name, seito[i].average); } return 0; } これを、もうちょっと応用を利かせ、 固定されているデータ部分 { 1, "SAKURAI", 78.6 }, { 2, "NAGANO", 57.3 }, { 3, "TAKESHITA", 66.4 }, をテキストファイルなどからfgetと組み合わせてデータを取りたいのです。 どうやればよいのかネット上を探してみたのですが、 なかなか似たようなものがありませんでした。 どうやればよいのでしょうか。 また、これは可能なのでしょうか。 教えてください。 また、参考になる書籍、URLなどもあれば併せて教えていただければ幸いです。

  • 構造体の構造体 引数

    構造体の中の構造体の関数の引き渡し方法がわかりません。 下記ソースで試したのですが、うまくいきませんでした。 助言お願いいたします。 //repo.c #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #define NUM 20 #define MAX 15 struct seiseki{ float shu[3]; }; struct seito{ char name[NUM]; int age; struct seiseki kekka; }; void input(struct seito *p); void s_input(struct seiseki *p); void ss_input(struct seiseki *data); int main(){ int i; struct seito data[2]; for(i=0;i<2;i++){ printf("------------------------------\n"); printf("%d人目",i+1); input(&data[i]); } printf("%f\n",data[0].kekka.shu[0]); printf("%f\n",data[0].kekka.shu[1]); printf("%f\n",data[0].kekka.shu[2]); //data[1]に格納できない。 printf("%f\n",data[1].kekka.shu[0]); printf("%f\n",data[1].kekka.shu[1]); printf("%f\n",data[1].kekka.shu[2]); return 0; } void input(struct seito *p){ printf("名前->"); scanf("%s",p->name); printf("年齢->"); scanf("%d",p->age); s_input(&(p->kekka)); } void s_input(struct seiseki *data){ printf("国語->"); ss_input(data); printf("算数->"); ss_input(data); printf("英語->"); ss_input(data); } //下記関数で成績をchar型で受け取り、数値化したい。 void ss_input(struct seiseki *data){ char p[100]; int i=0; static int o=0; scanf("%s",p); while( p[i] != '\0'){ if(isdigit(p[i])==0){ printf("再入力してください"); scanf("%s",p); } i++; } data->shu[o]=atof(p); printf("%f\n",data->shu[o]); o++; }

  • 構造体で・・・・

    構造体は配列を使用せずメモリ領域を獲得する関数を使用すること、 *構造体内部のメンバ名には配列を用いて良い。  という、条件があるのですが場合はどのようにすればよろしいでしょうか? どなたか教えてください。 構造体は以下のようになってます。 /*構造体の定義*/ struct seiseki{   char name[20];   int eig;   int suu;   int kok;   char rank[3]; };

  • 構造体型のポインタ変数を含む構造体

    struct seiseki_tag { Int32 math ; Int32 english ; Int32 science; } ; typedef struct seiseki_tag SEISEKI ; struct personal_tag { Char name ; Int32 num ; SEISEKI *sptr } : typedef struct personal_tag PERSONAL ; struct info_tag { PERSONAL person_info ; } ; typedef struct info_tag INFO ; たとえば、上記のように3つの構造体があり、PERSONAL構造体のメンバーに SEISEKI構造体の型を持つポインタ変数が含まれているような場合で、下記のように INFO型のポインタ変数からSEISEKI構造体のメンバーを参照する方法を教えてください。 PERSONAL構造体メンバーのnameやnumは INFO *info ; info->person_info.name ; info->person_info.num ; のように参照すると思いますが、sptrが示すSEISEKI構造体のメンバーへの アクセスができません。下記のように参照を試みたのですがコンパイルは 通るのですが、実際に参照できていませんでした。 INFO *info ; SEISEKI *seiseki ; seiseki = info->person_info.sptr ; seiseki->math ; 判りにくい説明で申し訳ありませんが、どなたか教えていただければと思います。 よろしくお願いいたします。

  • 構造体での2次元配列の宣言について

    構造体で2次元配列を初期化したいのですがうまくいきません。どうすればいいでしょうか? #include<stdio.h> struct student{ long gakusekino; char name[20]; char clas[5]; long age; }seito[10] = {2004001,"Aクン","sskk",20},        {2004001,"Bクン","ssdd",20}; /*下記はコンパイルが成功する例ですが上記の記述がうまくいかないしだいです。 struct student seito[10] = { {2004001,"Aクン","sskk",20},   {2004001,"Bクン","ssdd",20}; };

  • 構造体で配列を使用しない方法。

    構造体で配列を使用せずに、メモリ領域を獲得する関数を使用する場合はどうすればよろしいですか??  例 char *str; struct seiseki{ char name[20]; int eig; int suu; int kok; char rank[3]; }; str = ()malloc();

  • C言語の文字列を含んだ構造体

    下記のサイトに構造体のことが書かれています。 http://www.isl.ne.jp/pcsp/beginC/C_Language_14.html その中の (3)構造体の初期化 の記述で  //構造体の型宣言  struct student{   int no; // 学籍番号   char name[256]; // 氏名   int year; // 学年   char student_class[256]; // クラス  }; と書かれています。 次の(4)構造体のデータ参照では、  //構造体の型宣言  struct OLD{   int no; //番号   char *name; //名前   int s_year; //年   char s_class; //クラス  }; と書かれています。 ここで質問です。 前者の名前は char name[256] ですが、 後者の名前は char *name になっています。 name[256] と *name では何が違うのでしょうか? どういうときに使い分けるのでしょうか?

  • 構造体メンバ及び、strncpy()について

    /* 構造体のメンバを char name[30]; にした時は実行できますが、char *name; としたときはプログラムを実行できません。 コンパイルエラーはともに出ないのですが、strncpy();の使い方が間違っているのか、先に構造体側でメモリサイズを確保しないと、使えないのか? メンバをポインタで持たせた構造体を初期化する関数の作り方を教えてください。 よろしくお願いします。 */ #include <stdio.h> #include <string.h> typedef struct{ char *name; int no; }ST; void set_name(ST *st, char *name, int no); int main(void) { ST st; set_name(&st, "テスト", 1); printf("%s No%d\n", st.name, st.no); return 0; } void set_name(ST *st, char *name, int no) { strncpy(st->name, name, 30); st->no=no; }

  • C言語 構造体配列 list

    プログラミングでこの問題がわからないので教えてください! 下記の構造体タグseisekiを使って,表に示すデータをもつ構造体配列listを作成する. 構造体配列listを利用して,一番点数の高い 者を探し,その名前を表示する. struct seiseki{ char name[30]; int score; name score }; 表 佐藤 80 鈴木 75 田中 95 高橋 90

専門家に質問してみよう