• 締切済み

構造体の使い方

構造体の基本的な使い方を練習しようと思ったのですが、 なかなかスムーズにいきません。 p.d=10; の部分がおかしいようなのですが、色々試してもコンパイルできませんでした。 正しい使い方を教えていただけないでしょうか ソース ↓ #include<stdio.h> struct type{ int a; float b;  double c; }var,*p; main(){ c=9.87;      p=&var; p.d=10; p->b=1.2; printf("int:%d\n",*p); printf("float:%.1f\n",&p); printf("double:%.3lf\n",c); return 0; }

みんなの回答

noname#119918
noname#119918
回答No.4

順番に挙げていきますと、 (1)変数cの型なし。 例) float c = 9.87; (2)p.d pは構造体のポインタですので、p->d=10; としないとエラーです。 (3)printf("int:%d\n",*p); *pということは構造体ですが、構造体を%dフォーマットで受け取ることは できません。 例)printf("int:%d\n",p->a); (4)printf("float:%.1f\n",&p); &pということは、構造体のポインタのポインタになります。 これはどのような意図で記述しているのですか? ざっと挙げると以上の通りです。 No.3さんのおっしゃるとおり、C言語の本を一冊手元に置いて 基本的な部分から取り組むべきだと思います。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★ちゃんとしたテキストは持っていますか? >構造体の基本的な使い方を練習しようと思ったのですが、 >なかなかスムーズにいきません。  ↑  構造体の基本的な使い方が解説されている本を1冊用意するか、本屋でさらっと見て  確認してみた方が良いでしょう。構造体は複数の変数をまとめて管理するだけなので  そんなに難しくはありません。 >色々試してもコンパイルできませんでした。  ↑  『struct type』構造体の『d』メンバがありません。  また main() 関数で『c』変数が宣言されていません。  あと『p.d』ではなく『p->d』か、『(*p).d』とします。  3つ正しくなかったのでコンパイルできないのです。 >正しい使い方を教えていただけないでしょうか  ↑  C言語の本、持っていないのかな?  持っていれば『構造体』は定番のはず。載っていると思いますけど。  (問題集ではなく堅苦しい解説書などです)  次のリンク先  http://homepage3.nifty.com/mmgames/c_guide/index.html→『苦しんで覚えるC言語』  にある  http://homepage3.nifty.com/mmgames/c_guide/16-01.html→『異なる型の変数をまとめる』  http://homepage3.nifty.com/mmgames/c_guide/16-02.html→『構造体の引数』  http://homepage3.nifty.com/mmgames/c_guide/16-03.html→『構造体の配列』  http://homepage3.nifty.com/mmgames/c_guide/16-q.html→『練習問題16』  を参照して下さい。 基本: ・構造体のメンバは普通は『.』演算子でアクセスします。  でも構造体のポインタは『->』演算子でもアクセスできます。  つまり、  struct type {   int a;   float b;   double c;  } var, *p;    // 普通は『.』演算子で  printf( "a=%d\n", var.a );  printf( "b=%f\n", var.b );  printf( "c=%f\n", var.c );    // ポインタは『->』演算子で  p = &var;  printf( "a=%d\n", p->a );  printf( "b=%f\n", p->b );  printf( "c=%f\n", p->c );    // ポインタで『.』演算子を使うなら  p = &var;  printf( "a=%d\n", (*p).a );  printf( "b=%f\n", (*p).b );  printf( "c=%f\n", (*p).c );  とします。 配列: ・例えば struct type data[ 100 ]; を宣言すると  for ( i = 0 ; i < 100 ; i++ ){   printf( "a=%d\n", data[i].a );   printf( "b=%f\n", data[i].b );   printf( "c=%f\n", data[i].c );   printf( "\n" );  }  とします。 ・ポインタの場合は  struct type *p = data;    for ( i = 0 ; i < 100 ; i++, p++ ){ ←ポインタ(p)++   printf( "a=%d\n", p->a );   printf( "b=%f\n", p->b );   printf( "c=%f\n", p->c );   printf( "\n" );  }  とします。 ・以上。

hihhuhha
質問者

お礼

ありがとうございました。 C言語のサイトを見て回るだけだったんですが、本もちゃんと用意しようと思います。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

ついでにいえば, ポインタに対して「.」演算子は使えないわなぁ.

  • dsuekichi
  • ベストアンサー率64% (171/265)
回答No.1

> p.d=10; > の部分がおかしいようなのですが、 提示された構造体に「d」の定義はありませんけど・・・ #a,b,cしか定義していない・・・ 投稿ミスですか?