任意の型のポインタを格納する場合

このQ&Aのポイント
  • 任意の型のポインタを指定できるアドレス格納変数を作成し、任意の型(fuga1_t、fuga2_t)を指定できるようにしたい。
  • 下記コードにて所望の動作ができていますが、他の書き方があれば教えてください。
  • プログラムは問題なく動作しています。
回答を見る
  • ベストアンサー

任意の型のポインタを格納する場合

構造体にて、任意の型のポインタを指定できるアドレス格納変数を作成し(下記 hoge_tのメンバaa) そこに任意の型(下記fuga1_t、fuga2_t)を指定できるようにしたいと思っております。 下記コードにて所望の動作ができておりますが、こういう場合はこういう書き方をするものだ、 というものがあればお教え下さい。 (または下記記載の通りで正しい場合はこの書き方で問題ない、などいただけると助かります) #include <stdio.h> ///////////////////子struct typedef struct{ long num; long test; }fuga2_t; typedef struct{ int num; int test; }fuga1_t; ////////////////////親struct typedef struct{ int *aa; //ここにfuga1、fuga2両方設定したい場合がある }hoge_t; int main(void){ hoge_t hoge1; hoge_t hoge2; fuga1_t fuga1; fuga2_t fuga2; //初期化 fuga1.test = 10; fuga2.test = 11; //代入 hoge1.aa = (int*)&fuga1; hoge2.aa = (int*)&fuga2; printf("%d \n", (((fuga1_t*)(hoge1.aa))->test)); printf("%ld \n", (((fuga2_t*)(hoge2.aa))->test)); return 0; }

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

  • ベストアンサー
回答No.1

typedef struct{ void *aa; }hoge_t;  ... //代入 hoge1.aa = &fuga1; hoge2.aa = &fuga2; printf("%d \n", (((fuga1_t*)(hoge1.aa))->test)); printf("%ld \n", (((fuga2_t*)(hoge2.aa))->test)); void*型のポインタ変数にはどんな型のアドレスでも代入できます。 保存されたアドレスを使うときにキャストします。

関連するQ&A

  • ポインタのサイズ

    ポインタのサイズがintと同じになるのは知っているのですが、 以下のコードの場合、 typedef struct hoge{ char buf1[8]; char buf2[16]; }HOGE; void test_func(HOGE *pHoge) { printf("型[%d],実際[%d]\r\n", sizeof(HOGE), sizeof(*pHoge)); memset(pHoge, 0x00, sizeof(*pHoge)); } 正しくサイズが取得できるのですが、 この使い方はC99の仕様的には正しいのでしょうか? よろしくお願いします。

  • C++/Cこういうことは可能でしょうか?違う型の引数をとって同じようなことをする

    お世話になります。 C++の初心者です。 違う引数をとって同じ関数にいれて同じようなことをさせるというのは できるのでしょうか? コンストラクタの作成方法で可能?? 共用体で可能?? 例: 型の違う構造体A,Bがある。 構造体のメンバには同じstatusが存在する。 statusが1のときだけresultを+し値を返す。 typedef struct{   int status;   int b; } DATA_A; typedef struct{   int status;   int b;   int c; } DATA_B; int test(DATA_AかDATA_Bを引数でとる,int data_num){ //data_numはデータ数  int i=0;  int counter=0;  for(i=0;i<data_num;i++){   //DATA_AまたはDATA_Bのメンバstatusが1ならcounterを+する   if(DATA_A.status == 1){    counter++;   }  }  return counter; } 以上のような感じです。 引数の型が違う2つの関数を作ればできますが、 同じことをさせるので同じ関数で実現できないかなと思って 質問させてもらいました。 よろしくおねがいします。

  • ポインタがわからない

    C言語初心者です。 Int num; Int  *p=&num; という変数を宣言したとします。 下は「int *型」と呼び、pは「int型オブジェクトであるnumを指すポインタ」であることはわかりました。 ですが、「int型」と「int  *型」そのものの違いがわかりません。 たとえば、今読んでいるテキストに Printf(“int 型は%uバイトです。\n”,(unsigned)sizeof(int));→結果は2バイト Printf(“int *型は%uバイトです。\n”,(unsigned)sizeof(int *));→結果は4バイト 僕の環境では両方とも4バイトと結果は変わりませんでしたがテキストでは結果は上記のように変わってきてしまうようでした。これはなぜ変わってくるのでしょうか? 「int型」と「int  *型」そのものを比較した際の違いがわかりません。

  • C言語で型汎用性のある関数を作成したい

    C言語です。 下記のコードでは、期待した通りにメンバにアクセスできるのですが、 構造体のメンバが多くなったとき、構造体をネストしているときには、 挙動がおかしく(なにか別の値をとりだしてしまっている?)なります。 どのようにしたら型汎用のある関数を書くことができるでしょうか? (C++ならば、汎用(テンプレート)関数があるけれども。。。) #include <stdio.h> struct hanyo{ int i; }; struct aaa{ int i; long l; char str[100]; }; struct bbb{ int i; }; void hoge(hanyo *ph){ printf("%d\n", ph->i); return; } int main(){ aaa a; a.i = 1; bbb b; b.i = 2; hoge((hanyo *)&a); hoge((hanyo *)&b); return 0; } ----実行結果---- 1 2 続行するには何かキーを押してください . . .

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

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

  • 構造体メンバ 構造体ポインタ 値代入

    typedef struct _test_t{ int aaa; int bbb; } test_t; typedef struct _globalData{ int xxx; test_t* pTestData[256]; } globalData_t; globalData_t globalData; int main(){ test_t testData1 = {1,1}; test_t testData2 = {2,2}; *globalData.pTestData[1] = testData1; /* (1) */ globalData.pTestData[2] = &testData1; /* (2) */ } 上記のようなグローバルデータの構造体globalData のメンバの構造体配列にtest_t型の構造体を格納し保持するには、 (1)、(2)のどちらが正しいでしょうか?

  • 互いのクラスで互いのクラスのポインタを持ち合う方法

    ◆hoge.h #pragma once #include "fuga.h" class Choge{ protected:  Cfuga *fuga; public:  Choge( void ){ fuga=new hoge(this); }  ~Choge(); }; ◆fuga.h #pragma once #include "hoge.h" class Cfuga{ protected:  Choge *hoge; public:  Cfuga( hoge *h ){ hoge=h; }  ~Cfuga(); }; このように互いのポインタを持ち合うようなクラスを作りたいのですが、 下記のようなエラーが出てどうにもうまくいきません。 c:\...\hoge.h(5) : error C2143: 構文エラー : ';' が '*' の前にありません。 c:\...\hoge.h(5) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません c:\...\hoge.h(5) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません 環境はVisualC++2005(ExpressEdition)、WindowsXPです。 どうすれば実現できるでしょうか?

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

    ポインタを理解するために以下のようなテストプログラムを作りました。 test.h --- typedef struct i_info{ int i_id; char i_name[64]; } I_INFO; typedef struct j_info{ int j_id; char j_name[64]; } J_INFO; typedef struct k_info{ int k_id; char k_name[64]; } K_INFO; typedef struct info{ int id; char name[64]; I_INFO iinfo; J_INFO *jinfo; K_INFO **kinfo; } INFO; --- test.c --- 1 #include <stdlib.h> 2 #include <stdio.h> 3 #include "./test.h" 4 5 int main(int argc, char **argv) 6 { 7 INFO info; 8 J_INFO j; 9 K_INFO k; 10 K_INFO *pk=NULL; 11 12 memset (&info,NULL,sizeof(info)); 13 memset (&j,NULL,sizeof(j)); 14 memset (&k,NULL,sizeof(k)); 15 16 info.id = 1; 17 memcpy(info.name,"***",3); 18 19 info.iinfo.i_id = 2; 20 memcpy(info.iinfo.i_name,"*i*",3); 21 22 info.jinfo = &j; 23 j.j_id = 3; 24 memcpy(j.j_name,"*j*",3); 25 26 info.kinfo = &pk; 27 pk= &k; 28 k.k_id = 4; 29 memcpy(k.k_name,"*k*",3); 30 31 printf( "%d\n",info.id); 32 printf( "%s\n",info.name); 33 printf( "%d\n",info.iinfo.i_id); 34 printf( "%s\n",info.iinfo.i_name); 35 printf( "%d\n",info.jinfo->j_id); 36 printf( "%s\n",info.jinfo->j_name); 37 /* 38 printf( "%d\n",info.kinfo->k_id); 39 printf( "%s\n",info.kinfo->k_name); 40 */ 41 } --- 38,39行目をコメントアウトするとコンパイルは通るのですが、 そのままだとコンパイルエラーになります。 なぜいけないのでしょうか?理由を教えてください。

  • ポインタ型配列のポインタを構造体のポインタ変数に格納する方法教えて!_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入門書の著者のサポートページには正誤表とダウンロードしかないためこちらで質問させていただきます。 下記のコードの下から二行目の構造体へのポインタ (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; }

専門家に質問してみよう