C 指向不同结构的指针数组
这样做是可能的 但结构不同 例如C 指向不同结构的指针数组,c,arrays,pointers,struct,C,Arrays,Pointers,Struct,这样做是可能的 但结构不同 例如 某些类型将是什么样子?您可以将某些类型定义为一个联合体: typedef union{ struct structA_t; struct structB_t; struct structC_t; }some_type; 这将导致一个问题,即您不知道数组中哪个元素实际包含什么 要解决此问题,请添加另一个字段,指定所使用的内容: /* numbers to identify the type of the valid some_type element
某些类型将是什么样子?您可以将
某些类型
定义为一个联合体:
typedef union{
struct structA_t;
struct structB_t;
struct structC_t;
}some_type;
这将导致一个问题,即您不知道数组中哪个元素实际包含什么
要解决此问题,请添加另一个字段,指定所使用的内容:
/* numbers to identify the type of the valid some_type element */
typedef enum my_e_dataId{
dataid_invalid = 0,
dataid_a,
dataid_b,
dataid_c
} my_dataId;
typedef union u_data {
struct structA_t* a;
struct structB_t* b;
struct structC_t* c;
}mydata;
typedef struct s_some_type{
my_dataId dataId;
mydata myData;
}some_type;
然后可以按如下方式初始化阵列:
some_type sta[] = {
{dataid_a, (struct structA_t*) &a},
{dataid_b, (struct structA_t*) &b},
{dataid_c, (struct structA_t*) &c}
};
当您在array
的元素上循环时,首先计算dataId
,以便了解myData
中包含的内容。然后,例如,使用
sta[0].myData.a->FIELDNAME_OF_A_TO_ACCESS
或者第三个元素
sta[2].myData.c->FIELDNAME_OF_C_TO_ACCESS
查看此ideone以获得一个工作示例:您可以将
某些类型定义为一个联合体:
typedef union{
struct structA_t;
struct structB_t;
struct structC_t;
}some_type;
这将导致一个问题,即您不知道数组中哪个元素实际包含什么
要解决此问题,请添加另一个字段,指定所使用的内容:
/* numbers to identify the type of the valid some_type element */
typedef enum my_e_dataId{
dataid_invalid = 0,
dataid_a,
dataid_b,
dataid_c
} my_dataId;
typedef union u_data {
struct structA_t* a;
struct structB_t* b;
struct structC_t* c;
}mydata;
typedef struct s_some_type{
my_dataId dataId;
mydata myData;
}some_type;
然后可以按如下方式初始化阵列:
some_type sta[] = {
{dataid_a, (struct structA_t*) &a},
{dataid_b, (struct structA_t*) &b},
{dataid_c, (struct structA_t*) &c}
};
当您在array
的元素上循环时,首先计算dataId
,以便了解myData
中包含的内容。然后,例如,使用
sta[0].myData.a->FIELDNAME_OF_A_TO_ACCESS
或者第三个元素
sta[2].myData.c->FIELDNAME_OF_C_TO_ACCESS
查看此ideone以获得一个工作示例:在C中,这可以通过void指针实现(将“struct some_type”替换为“void”),但您确实不应该这样做。数组用于使用同质数据编程。在C中,这可以通过void指针实现(将“struct some_type”替换为“void”),但您确实不应该这样做。数组用于使用同质数据进行编程。我认为您对C中的“数组”一词的含义感到困惑。数组指的是一组相同数据类型的元素。说明您的问题定义,比如为什么需要这样的东西,会使这成为一个更好的问题,或者只是您的好奇心?C不太适合这个问题。你要做的是实现一个“包”,这需要一种具有运行时多态性的面向对象语言。我只是希望可以创建一组不同的结构和数组,其中包含该结构的指针,以及另一组包含指向结构成员的指针的数组(将定义索引)。所有这些都是一个用于管理我的结构元素和C语言中的所有元素的函数。我认为您对术语“数组”的含义感到困惑在C中表示。数组表示相同数据类型的一组元素。说明您的问题定义,说明为什么需要这样的东西,会使这成为一个更好的问题,或者只是您的好奇心?C不太适合这个问题。你要做的是实现一个“包”,这需要一种具有运行时多态性的面向对象语言。我只是希望可以创建一组不同的结构和数组,其中包含该结构的指针,以及另一组包含指向结构成员的指针的数组(将定义索引)。所有这些都是为了一个函数来管理我的结构的元素,所有这些都是用C语言编写的。正如你所说的,不应该这样做。这个人怎样才能区分在哪个索引处存在什么类型的元素呢?好吧,switch语句是原始多态性,可以添加第二个类型枚举数组,或者像上面的答案那样使用标识符包装在一个联合中,但这确实回答了这个问题。正如你所说的,不应该这样做。这个人将如何区分在哪个索引处存在什么类型的元素?好吧,switch语句是原始多态性,可以添加第二个类型枚举数组,或者像上面的答案那样用标识符包装在一个联合中,但这确实回答了这个问题。回答得好,但是换掉枚举的#定义。枚举更安全#define擅长写一些东西,包括enum、其他#define,甚至变量名,而enum在发生此类冲突时会产生真正的编译错误。enum{a=4};枚举{a=5}
是一个编译错误,这就是我所指的那种情况,这也是为什么enum比#define更受欢迎的原因。@eckes我现在意识到,仍然有数组只有一种结构类型。这将不起作用,这将是目标(我的意思是下面的代码将是目标):一些类型的sta[]={{dataid_a,(struct structA_t*)&a},{dataid_b,(struct structB_t*)&b},{dataid_c,(struct_t*)&c}@bienieck:cast tostruct structA\u t*
只需要满足编译器的要求(否则将产生警告)。实际上,数组中存储的数据是正确的。请参阅ideone:答案很好,但将#定义替换为枚举。枚举更安全#define擅长写一些东西,包括enum、其他#define,甚至变量名,而enum在发生此类冲突时会产生真正的编译错误。enum{a=4};枚举{a=5}
是一个编译错误,这就是我所指的那种情况,这也是为什么enum比#define更受欢迎的原因。@eckes我现在意识到,仍然有数组只有一种结构类型。这将不起作用,这将是目标(我的意思是下面的代码将是目标):一些类型的sta[]={{dataid_a,(struct structA_t*)&a},{dataid_b,(struct structB_t*)&b},{dataid_c,(struct_t*)&c}@bienieck:cast tostruct structA\u t*
只需要满足编译器的要求(否则将产生警告)。实际上,数组中存储的数据是正确的。见表意文字: