我想将混合数据类型存储在数组中.怎么会有人这样做呢?

推荐答案

可以将数组元素设为一个有区别的并集,即tagged union.

struct {
    enum { is_int, is_float, is_char } type;
    union {
        int ival;
        float fval;
        char cval;
    } val;
} my_array[10];

type成员用于 for each 数组元素 Select union中的哪个成员.因此,如果要在第一个元素中存储int,可以执行以下操作:

my_array[0].type = is_int;
my_array[0].val.ival = 3;

当您想要访问数组的一个元素时,必须首先判断类型,然后使用union的相应成员.switch句话很有用:

switch (my_array[n].type) {
case is_int:
    // Do stuff for integer, using my_array[n].ival
    break;
case is_float:
    // Do stuff for float, using my_array[n].fval
    break;
case is_char:
    // Do stuff for char, using my_array[n].cvar
    break;
default:
    // Report an error, this shouldn't happen
}

由程序员来确保type成员始终与union中存储的最后一个值相对应.

C++相关问答推荐

了解返回函数指针的函数定义

为什么在传输 Big Data 时共享内存段的运行时间比管道更长?

在Windows上构建无聊的SSL x64

intellisense不工作,甚至已经下载了c/c++扩展

ATTiny1606定时器TCA 0中断未触发

在C中使用动态内存分配找到最小的负数

如何在C中通过套接字自定义数据类型读取原始变量?

以下声明和定义之间的区别

为什么我不能只在内存地址中添加一个int来寻址任何数组?

是否可以使用指针算法在不对齐的情况下在 struct 中相同类型的字段的连续序列之间移动?

限制不同类型的限定符

如何使解释器存储变量

S将C语言宏定义为自身的目的是什么?(在glibc标题中看到)

获取前2个连续1比特的索引的有效方法

C代码可以在在线编译器上运行,但不能在Leetcode上运行

S,在 struct 中创建匿名静态缓冲区的最佳方式是什么?

C编译和运行

为什么GCC不能在 struct 初始值设定项中以sizeof作为条件的三进制中处理复合文字的编译时求值?

按字典顺序打印具有给定字符的所有可能字符串

为什么 C 字符串并不总是等同于字符数组?