構造対のメンバについて

このQ&Aのポイント
  • プログラミング形式に戸惑っている方へ。構造体のメンバについて簡単に解説します。
  • 構造体の最後の変数の意味やmain文内の変数の値の代入先について解説します。
  • プログラミング初心者のための、構造体と変数の関係についてわかりやすく説明します。
回答を見る
  • ベストアンサー

構造対のメンバについて

今とあるプログラミングの解析を行っていて、初めて見るプログラミング形式に戸惑っています。 実際には下記のようなものです。 #include <stdio.h> typedef struct test1{ double a; int c; struct test1 *ptr }Test; void main(){ Test *pp; int a; pp->ptr=a; } 本当はもっと長いプログラミングですが、抜粋して書きました。 もし分かりにくかったら補足します。 ここで質問なのですが、最初に定義した構造体の最後の変数(?)は一体どうゆう意味なのでしょうか。 また、main文の中でこのpp->ptrにaを代入してますが、このaはどこに入っていくのでしょうか。 自分でも非常に困惑している状態なので拙い文章になってしまい申し訳ありません。

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

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.2

>ここで質問なのですが、最初に定義した構造体の最後の変数(?)は一体どうゆう意味なのでしょうか。 「自己参照構造体」で検索して下さい。 リスト構造を作る際に使われます。 # 参照先が1つなので、単方向リスト構造になるでしょうが… >また、main文の中でこのpp->ptrにaを代入してますが、このaはどこに入っていくのでしょうか。 自己参照の次の要素として…ですが、int型を突っ込むのはおかしいです。 ついでに、ppが指している先が不定です。 # おそらく省略した中にあるのでしょうが…。

simizukiyo
質問者

お礼

お礼が遅くなってしまって申し訳ありません。 自己参照構造体という形式なのですね。 そのキーワードでググってみたらなんとなく理解出来ました! pp->ptr=aというのがあり得ないというのも理解できました。笑 とりあえずはNULLを入れておいて、次の構造体の文のメモリを確保して・・・を繰り返していく感じなのですね。 ありがとうございました!

その他の回答 (3)

  • higeG
  • ベストアンサー率22% (4/18)
回答No.4

データ構造とアルゴリズムに関する書籍かサイトを読むことをお勧めします。 そうすれば、自ずと上記プログラムの内容が理解できるようになると思います。 逆にそれなしで理解することは至難の技かと。

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.3

>struct test1 *ptr ――は、線形リストを構成する常套手段。 > pp->ptr=a; もし本当にこの通りなら、単なるプログラム誤りかと。 抜粋されたところ以外をちゃんと読めば、何か分かるかもしれませんが。

参考URL:
http://www.google.co.jp/search?hl=ja&q=%E7%B7%9A%E5%BD%A2%E3%83%AA%E3%82%B9%E3%83%88&lr=lang_ja
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

>構造体の最後の変数(?)は一体どうゆう意味なのでしょうか。 このような構造体を「自己参照型構造体」といいます。 リスト構造などのデータ構造を実装する際に用います。 メンバーptrは、自分と同じ型を指すためのポインター変数です。 >main文 main関数です。main文という用語はありません。 >pp->ptrにaを代入してます ポインター変数にint型を代入すると、通常は何かおかしなことが起きます。 抜粋する際に見間違えていませんか?

関連するQ&A

  • 構造体のメンバ参照について(C言語)

    初めて書き込みする,taroimotenです. 以下のプログラムを作ってみたのですが, メモリ参照エラーが表示され,うまく動きません. アドバイスおねがいします! #include <stdio.h> #include <stdlib.h> // 型宣言. typedef struct data DATA; typedef struct coords COORDS; // 構造体の定義. struct data{ COORDS *pnt[3]; }; struct coords{ float r1; float r2; }; int main(void) { DATA *ptr; DATA x; // ポインタ変数の初期化. ptr = &x; // メンバへの値の代入. ptr->pnt[0]->r1 = 100.0; printf(" r1 : %f \n",ptr->pnt[0]->r1); return EXIT_SUCCESS; }

  • 構造体と配列の関係

    #include<stdio.h> typedef struct stat { char alph; int count; }Stat; int main(void) { Stat al[26]; al.alphにアルファベットaからzを、al.countを全て0とし、各アルファベットに対するカウントを取れるようにしたいのですが、どのように書けば良いでしょうか?

  • 構造体の配列の配列

    include <stdio.h> struct test{ char str[80]; }; void main(void) { struct test array[10] ・・・ とあるのですが、arrayに文字列を代入する方法は、 struct test array[10] = {{"kei"},{"fsa"},{"tu"}, {"vu"},{"qu"},{"bi"},{"bu"},{"wo"},{"qiu"}}; と言うような方法しかないのでしょうか? ひとつひとつ代入はできないのでしょうか? よろしくお願いします。

  • ポインタを使って構造体の配列を戻り値にするには

    関数の戻り値を構造体の配列(アドレスを受け渡しを利用して)にしたいのですがうまくゆきません。 以下のプログラムではコンパイルはできるのですが、 a0 = 2 a1 = 4198512 a2 = 4329332 と表示されてしまいa1,a2がうまくゆきません。 ********************************************* #include<stdio.h> struct test{ int a; }; struct test *func(void); void main(void) { struct test *data;//構造体ポインタ int i; data = func(); //ポインタにtest関数の戻り値(アドレス)を代入 for(i=0;i<=2;i++){   printf("a%d = %d\n",i,(data+i)->a); //構造体要素を表示 } } struct test *func(void) { struct test data[3]={1,2,3}; //構造体配列を定義 return (&data[0]); //構造体配列の先頭アドレスを返す } ************************************************* test関数から受ける取ったアドレス(&data[0])をポインタ(data)に代入して1づつずらして表示させれば a0=1,a1=2,a=3 となると思ったのですがどこが間違っているのでしょうか? よろしくお願いします。

  • 構造体の配列を関数に渡すには

    構造体の配列を関数の引数として渡そうとすると エラーになってしまいます ネットで調べてもいまいちわからなかったので ここで質問させてもらいます #include<stdio.h> struct A{   ・    ・    ・ }; void func(struct A *p); int main(void) { struct A x[3][4] = {     ・     ・     ・ }; func(x); return 0; } void func(struct A *p){     ・     ・    ・ } どうすれば渡すことができるのでしょうか? どなたか助言お願いします。

  • 構造体メンバ及び、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; }

  • 構造体のメンバにファイルポインタがあるときの初期化について

    #include<stdio.h> typedef struct file{ FILE *fp; char filename[255]; int flag; }sFILE; main() { sFILE fp={ ,"output.txt",1100}; } のように書きたいんですが、sFILE fp={ ,"output.txt",1100};の最初のファイルポインタのところは何を入れたらいいんでしょうか?

  • C言語:double型での戻り値は小数点以下何桁ですか?

    Cでプログラミングの勉強をしています。 double型で宣言した変数をprintfで出力するとき、代入した数値は小数点以下1桁なのに、なぜか出力結果では6桁になると問題集に書かれていました。解説はありません。 プログラムは下のものですが、なぜかお分かりになる方、教えていただけませんか? #include<stdio.h> struct test{ int x; double y; } void print(struct test a); void set_value(struct test a); void main(void){ struct test a ={1, 2.0}; set_value(a); print(a); } void print(struct test a){ printf("a.x = &d, a.y= %f\n", a.x, a.y); } void set_value(struct test a){ a.x =10; a.y =20.0; }

  • C++でCの構造体をnewするとまずいのでしょうか?

    以下のようなCで書かれたヘッダがあったとして ---testc.h--- typedef struct __Test { int i; char c[30]; char* x; } Test; これを以下のようにnewして使うのは問題ないでしょうか? ---test.cpp--- extern "C" { #include test.h } int main(void) { Test* test = new Test(); test->i = 30; test->c[3] = 'a'; test->x = "aiueo"; return 0; }

  • 相互に参照する構造体について

    Cプログラミングについての質問です。よろしくお願いします。 以下のヘッダファイル(defx.h, defy.h)および、mainファイルが正しくコンパイルされるということなのですが、自分の環境(WinXP下でのgcc(MinGW))ではエラーが出ます。 エラー内容は error: redefinition of typedef 'SY' error: previous declaration of 'SY' was here error: redefinition of typedef 'SY' error: previous declaration of 'SY' was here です。 <defx.h> #if !defined(__SX) #define __SX typedef struct __sy SY; typedef struct { int a; SY *b; } SX; #endif <defy.h> #if !defined(__SY) #define __SY #include "defx.h" typedef struct __sy { int c; SX d; } SY; #endif mainファイルについては #include "defx.h" #include "defy.h" int main(void) { SX s; SY t; } 以上ですが、 よろしくお願い致します。

専門家に質問してみよう