• ベストアンサー

構造体を指すポインタからその中のポインタ変数が指す要素の参照

構造体を指しているポインタから、 その構造体内にあるポインタ変数の指している要素に値を代入する方法が、どうしてもわかりませんでした。 どなたか助けてください、お願いします。 struct Kouzou { int* p; }; int main() { Kouzou kou; Kouzou* k_p; k_p = &kou; k_p -> *p = 10; //エラー }

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

  • ベストアンサー
  • ranx
  • ベストアンサー率24% (357/1463)
回答No.1

*k_p->p = 10; ですけど、pが指す先を定義しておかないと エラーになりますよ。

skinhead_juggler
質問者

お礼

おもわずなるほど、と息をのんでしまいました。 おかげで解決致しました。 ありがとうございます。

その他の回答 (1)

  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.2

構造体Kouzouのメンバーpは、intのポインタです。 従って、代入できるのは値ではなく、アドレスです。 Kouzou kou; Kouzou* k_p; int intValue = 10; k_p = &kou; k_p ->p = &intValue; が正しいです。

skinhead_juggler
質問者

お礼

pの指す要素に代入をしようとしていたのですが、 私の質問の仕方が適切ではなく、質問の意図がわかりにくかったかもしれません。 しかし参考になりました。回答ありがとうございました。

関連するQ&A

  • void型のポインタで構造体の参照

    void型のポインタで構造体や共用体を参照することはできますか? void *p=&kou; struct KOU kou; (struct KOU*)kou.name="名前"; のようにして構造体を参照しようとしたのですが、「左側が構造体又は共用体ではありません。」と出ます。型キャストはコンパイラに型を知らせるだけのものなのでコンパイラが構造体の型を知ることができない、ということでしょうか?void型のポインタを使って構造体(共用体)を参照することはできますか?回答よろしくお願いします。

  • ポインタ型配列のポインタを構造体のポインタ変数に格納する方法教えて!_ver2

    int型の配列は構造体のポインタ型のint型変数にはキャストすればうまくコンパイルが通りますが、同じ方法でfloat型の配列は構造体のポインタ型のfloat型変数にはキャストしてポインタの値を入れてもうまくコンパイルできず困っています。ちなみにコンパイルエラーは「互換でない型変換」と表示されます。 返答のほど、よろしくお願いいたします。 #include<stdio.h> #include<malloc.h> float time[] ={2.2, 2.3, 2.4}; int time2[] ={2, 2, 2}; struct timelist{ float *time; int *time2; struct timelist *next; }*head; void main(void) { struct timelist *p; p = (struct timelist *)malloc(sizeof(struct timelist)); p -> time = (float *)time[0]; p -> time2 = (int *)time2[0]; printf("time = %f\n", p -> time); printf("time2 = %d\n", p -> time2); }

  • 構造体ポインタで構造体全体を参照 [C言語]

    構造体へのポインタで参照先の構造体全体を参照するには *構造体ポインタ名 でいいでしょうか?これで構造体同士の値のコピーはできるみたいなのですが、printfで*構造体名を表示すると参照先の構造体と値が違ってきてしまいます。 printf("*pkou=%d,kou=%d",*pkou,kou); //pkouは構造体kouへのポインタ 《結果》 *pkou=-23135123,kou=1257234 (値は適当ですがこんな感じです) 友人へ「"*構造体ポインタ名"とすると参照先の構造体全体を表している」と言ってしまっていいでしょうか。回答よろしくお願いします。

  • C言語の構造体についてなんですが。

    struct LIST {     struct Num* number;     struct LIST* next;/* 次の要素へのポインタ */ }*root; struct Num{     int a;     struct Num* next; /* 次の要素へのポインタ */ }*numroot; と構造体を定義したときに、 main(){     struct LIST *p;     for(p = root; p != NULL; p = p->next) ; } とすれば、pの先頭からNULLまでを参照していくことは分かるんですが、pのnumberの先頭からNULLまでの参照方法(プログラムのfor文の記述方法)がイマイチわかりません。つまり、構造体の構造体をどのように参照するかということです。 これを実現したい理由は、構造体内での数の格納を配列(固定長)ではなく可変長で格納したいからです。 分かる方は解答をお願いします。

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

    関数の戻り値を構造体の配列(アドレスを受け渡しを利用して)にしたいのですがうまくゆきません。 以下のプログラムではコンパイルはできるのですが、 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 となると思ったのですがどこが間違っているのでしょうか? よろしくお願いします。

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

    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 ; 判りにくい説明で申し訳ありませんが、どなたか教えていただければと思います。 よろしくお願いいたします。

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

    ポインタを使ってメンバに値を入力して表示するプログラムを作ったのですが、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' が使用されます」となっています。 初歩的な質問ですみません・・・。

  • 構造体のポインタ参照

    構造体のプログラムを作成しており、コンパイルを行った際にエラーが起きてしまいました。 以下に構造体宣言とメイン関数のプログラムをとエラーが出てしまった部分を記述します。 エラー表示の内容として「不完全型ポインタへの間接参照」と出ました。 自分なりに考えた結果、ポインタの参照部分に間違いがあるためエラーが起こったと思います。そのエラーが生じた部分のプログラムをどのように修正すればコンパイルが成功するか、ご教授のほうお願いします。 /* 構造体宣言 */ 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; }

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

    ポインタが指す構造体メンバの値の表示について 下記のプログラムの*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);

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

    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 とアクセスする方法ありませんか?

専門家に質問してみよう