ポインタを使った構造体のプログラムを作成する方法

このQ&Aのポイント
  • ポインタを使ってメンバに値を入力して表示するプログラムを作成する方法について教えてください。
  • プログラムの中でポインタ変数の初期化でエラーが発生しています。
  • エラーの内容は「初期化されていないローカル変数 'b' が使用されます」となっています。
回答を見る
  • ベストアンサー

ポインタを使った構造体のプログラム

ポインタを使ってメンバに値を入力して表示するプログラムを作ったのですが、mainのstruct XYZ aというオブジェクトと*bというそれを指すポインタを使ってプログラムを表示するにはどうすればいいのでしょうか。 これがプログラムです。 #include <stdio.h> struct XYZ { int x; long int y; double z; }; void set_xyz(struct XYZ *p,int x,long int y,double z) { p->x=x; p->y=y; p->z=z; } //void set_xyz(struct XYZ *,int,long int,double); int main() { struct XYZ a = {12,999999,1.41421356},*b; //ここのポインタ変数bでエラーが表示されます。 set_xyz(b,a.x,a.y,a.z); printf("a.x = %d\na.y = %d\na.z = %lf\n",b->x,b->y,b->z); return 0; } エラーの内容は「初期化されていないローカル変数 'b' が使用されます」となっています。 初歩的な質問ですみません・・・。

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

  • ベストアンサー
  • usa3usa
  • ベストアンサー率33% (20/59)
回答No.4

>エラーの内容は「初期化されていないローカル変数 'b' が使用されます」となっています。  b = &a; とか、  struct XYZ c;  b = &c; で、ポインタ変数bを初期化(bを struct XYZ のデータのどれかを指す)すれば、いいだけではないですか? 解説 struct XYZ a = {12,999999,1.41421356},*b; は、  struct XYZのデータ a と  struct XYZのデータを指すポインタ変数 b を定義しています。  aの中身は  {12,999999,1.41421356} です  bの中身はゴミ(何を指しているか不明)です  b = &a; ポインタ変数 b はstruct XYZのデータ a を指します  struct XYZ c;  b = &c; struct XYZのデータ c を定義し、 cの中身はゴミですが、 ポインタ変数 b はstruct XYZのデータ c を指します この直後に  set_xyz(b,a.x,a.y,a.z); を実行すれば、ポインタ変数 b の指すstruct XYZのデータ(今回はaやc) に a.x,a.y,a.z の3つのデータが書き込まれます。

eternidad_beyer
質問者

お礼

なるほど、エラーで出た初期化とはそういうことだったんですね。 うっかりしていました。 ありがとうございます。スッキリしました。

その他の回答 (3)

  • tsunji
  • ベストアンサー率20% (196/958)
回答No.3

bはポインタなので、変数を入れる場所がありません。 bをポインタではない宣言して、set_xyzに渡すときポインタで渡せばいい。

eternidad_beyer
質問者

お礼

そうすると、そもそもaだけでプログラムが完成できますね…。 b余計でした。すみません。 回答有難うございます。

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

>set_xyz(b,a.x,a.y,a.z); この時、bはどこを差しているんでしょう? >struct XYZ a = {12,999999,1.41421356},*b; こう記述したら、bがaを差している。という認識でしょうか?

eternidad_beyer
質問者

お礼

そういう認識ですね。 bというポインタを作って、それを差せば値が代入できるのでは、と考えた次第です。 ですが、bのどこに入れるかと言われてやっとわかりました。 ありがとうございます。

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

初期化すればいい.

eternidad_beyer
質問者

お礼

初期化はしてみたましたが更にエラーが増えただけでした。 回答有難うございます。

関連するQ&A

  • ポインタが指す構造体メンバの値の表示について

    ポインタが指す構造体メンバの値の表示について 下記のプログラムの*pは、saのエイリアスで、pが指すオブジェクトのメンバxは(*p)..xと表示されているが、*p.xまたは、*(p.x)は、文法的正しくないと書かれいる本が多いのでその理由を教えて頂きたい。 ****************************************************************** int main(void) { struct xyz { int x ; long y ; double z; } sa = {50, 99999999L ,3.14}; struct xyz *p =&sa; printf("(*p).x %d\n", (*p).x);

  • 構造体を使ったプログラム

    学校でC言語を勉強しています。(まだ初心者です) テストの成績を入力して、その結果を降順にソートしたいんですけど、 下記のプログラムでは、正常に動かないです。 struct seiseki { char nama; int sansuu; int rika; int goukei; }; ~~~~~~~~~~~~~~~~~~~~ struct seiseki class_a; struct seiseki class_b; struct seiseki *ptr1; struct seiseki *ptr2; ptr1 = class_a; ptr2 = class_b; ~~~~成績はあらかじめ入力済み~~~~ sout(class_a, 3); sout(class_b, 3); void sout(struct seiseki *p, int num) { struct seiseki temp; int count; int j; for (count = 1; num > count; count++) { temp = p[count]; for (j = count; j > 0 && p[j - 1].goukei < temp.goukei; j--) { p[j] = p[j - 1]; } p[j] = temp; p++; } } class_aだけを実行するプログラムだとちゃんと表示されますが、 一度でclass_aとclass_bを実行するプログラムだと表示がおかしくなります。 どなたか教えてください。

  • 構造体の中の構造体

    typedef struct number{ int x; struct number *next; }Num; 初心者な質問で申し訳ないんですが、構造体の中に構造体があるのはどう解釈していいんでしょうか? typedef struct number{ int x; int y; }Num; の場合はNum a,b;がint a.x,a.y,b.x,b.yとなるのは分かるんですが・・・

  • 構造体の要素すべてに対する四則演算の方法を教えてください.

    構造体の要素すべてに対する四則演算の方法を教えてください. たとえば、 2点a,bの座標成分x,y,zをそれぞれの座標ごとに足す方法を教えてください. 下のようにx,y,z成分を持ったa,bがあります。 struct point{ int x; int y; int z; }; struct point a; struct point b; struct point c; この場合, c=a+b; と書くことができず, それぞれの成分ごとに以下のように足さなくてはなりません. c.x=a.x+b.x; c.y=a.y+b.y; c.z=a.z+b.z; この方法でできるのですが, 非常に効率的でないのでなにかもっと簡単に記述する方法を教えてください. お願いいたします.

  • 構造体へのポインタ変数

    9バイトのデータがあって、先頭の1バイトの値によって、残り8バイトが2バイトデータ4つの場合と、4バイトデータ2つの場合があります。 つまり、 struct typeA { char a; int s,t,u,v;}; struct typeB { char a; long x,y}; char *p; pがそのデータの先頭を指している場合、 typeAならば、p->s とアクセスし、 typeBならば、p->x とアクセスしたいのですが、エラーになってしまいます。 思いついた対処法は、  struct typeA pa;  struct typeB pb; を定義しておいて、  pa = p; pa->s  pb = p; pb->x としてアクセスする方法ですが、新たに変数に代入するのが無駄(実際はコンパイラの最適化で問題ないとは思いますが)なので、もっと直接的に p->s とアクセスする方法ありませんか?

  • C#で構造体の配列を持った構造体を使いたいのですが

    C#で構造体の配列を持った構造体を使いたいのですが Cならば struct xyz { struct abc _abc[32]; int index; }; struct abc { int a; int b; int c; }; struct xyz _xyz[8]; xyz[0]._abc[3].b = 1; のような使い方で という感じで やっていた事を C#で 同じような事をやろうとしても うまくいきません うまくやる方法をどなたかご存知ないでしょうか Visual Studio 2005行った場合 コンパイルで 構文エラーです。不適切な配列の宣言子です。マネージ配列を宣言するには、次元指定子を変数の識別子の前に指定します。固定サイズ バッファ フィールドを宣言するには、フィールド型の前に fixed キーワードを使用します となり fixed をつけると 固定サイズ バッファの型は次のうちの 1 つでなければなりません: bool、byte、short、int、long、char、sbyte、ushort、uint、ulong、float または double となってしまいます

  • 構造体のポインタ参照

    構造体のプログラムを作成しており、コンパイルを行った際にエラーが起きてしまいました。 以下に構造体宣言とメイン関数のプログラムをとエラーが出てしまった部分を記述します。 エラー表示の内容として「不完全型ポインタへの間接参照」と出ました。 自分なりに考えた結果、ポインタの参照部分に間違いがあるためエラーが起こったと思います。そのエラーが生じた部分のプログラムをどのように修正すればコンパイルが成功するか、ご教授のほうお願いします。 /* 構造体宣言 */ typedef struct { int m; double *a; double *alpha; }PREDICTOR; int main(){ struct PREDICTOR *pred; int i; /* ここでエラーが起きました */ pred -> a[0] = pred -> a[1] =0; pred -> m = 0; pred -> alpha = r(0);  /* ここまで */ for(i = 0; i < M; i++){ pred = levin(pred); } return 0; }

  • 構造体や配列へのポインタについての質問です

    いつもお世話にばっかりなっているものですが、 表題の件で質問です。 ある関数で定義した構造体や配列へのポインターを、 他の関数で処理する方法ですが、 以下のやり方であっているでしょうか? typedef struct _abc { char name[50]; int value; } abc; の場合 void func_from() { abc xyz; char * y[2]; y[0] = xyz.name; y[1] = ( char * )&xyz.value; func_to( y, &xyz ); } void finc_to( char ** x, abc * pqr ) { *x = pqr->name; *( x + 1 ) = ( char * )&( *pqr ).value; } 上の例、数値は(char *)型にして入れる仕様だと思ってください。 本番バージョンはもっと違うのですが、 コンパイルエラーなく動いている、みたいです;D ただ、ぜんぜん自信がないので、 大丈夫だよと一言言ってもらえるか、 そらあかんは、というコメントお待ちしていますm(__)m

  • 構造体のポインタ

    なぜかprevのほうが表示されません。 問題としては関数を作成し gyuri[23] -> sunyon[23] -> nicole[20] -> hara[20] -> jiyon[17] -> hara[20] -> nicole[20] -> sunyon[23] -> gyuri[23] -> END と表示させるのが目的です gyuri[23] -> sunyon[23] -> nicole[20] -> hara[20] -> jiyon[17] ここまではうまく表示できているのですが・・・ #include <stdio.h> void printoufuku(struct kara *p); struct kara { char name[16]; int age; struct kara *next; struct kara *prev; }; int main() { struct kara a, x, f, m, c, *start; strcpy(a.name, "gyuri"); a.age = 23; strcpy(x.name, "sunyon"); x.age = 23; strcpy(f.name, "nicole"); f.age = 20; strcpy(m.name, "hara"); m.age = 20; strcpy(c.name, "jiyon"); c.age = 17; a.next = &x; x.next = &f; f.next = &m; m.next = &c; c.next = NULL; /********************* 5 lines */ c.prev = &m; m.prev = &f; f.prev = &x; x.prev = &a; a.prev = NULL; /*********************/ start = &a; printoufuku(start); return 0; } void printoufuku(struct kara *p) { for(p->next; p != NULL;p = p->next){ printf("%s[%d] ->",p->name,p->age); } for(p->prev; p != NULL; p = p->prev){ printf("%s[%d] ->",p->name,p->age); } }

  • 構造体へのポインタについて

    初心者です。 C入門書の著者のサポートページには正誤表とダウンロードしかないためこちらで質問させていただきます。 下記のコードの下から二行目の構造体へのポインタ (Car *) について、中学生に説明するように基本的な考え方、目的、書式、参考URLなどを教えて下さい。 ポインタについては、該当の章を読み直し基本事項については理解しておりますが、突然あるページから(Void *)や(Char *)など括弧で閉じるものが説明なしに出てきてちょっと混乱してます。(汗 どうぞ宜しくお願い致します。 #include<stdio.h> /* 構造体型struct Carの宣言 */ typedef struct Car{ int num; double gas; }Car; int main(void) { printf("int型のサイズは%dバイトです。¥n", sizeof(int)); printf("double型サイズは%dバイトです。¥n", sizeof(double)); printf("構造体structCar型のサイズは%dバイトです。¥n", sizeof(Car)); printf("構造体struct Car型へのポインタのサイズは%dバイトです。¥n", sizeof(Car *)); return 0; }

専門家に質問してみよう