实际上我想要一个变量来接收各种值,无论是int还是float或char。任何人都可以告诉我一种方法来做到这一点。但程序应该是C(不是C ++)。
答案 0 :(得分:3)
您应始终使用对您的应用程序有意义的类型,但如果您确实需要“无类型”数据元素,则可以使用void *
执行此操作,然后通过类型转换将其用于任何您通过它:
void *myvar = malloc(100); // set up typeless element
*(int *)myvar = 10; // cast to an int and save an int
printf("%d\n", *(int *)myvar); // print as an int
*(float *)myvar = 10.25; // cast to a float and save a float
printf("%f\n", *(float *)myvar); // print as a float
答案 1 :(得分:1)
您的问题有两个答案。一个是使用联合(如果你只限于int,char和float)。另一种是致命的 void * 类型。它们都不是良好的编码实践。 也许你应该改变问题:)
union {
int i;
char c;
float f;
} u;
答案 2 :(得分:1)
C是一种强大的静态类型语言,因此在您要求的意义上,您不能拥有动态变量。我猜你可以有一个无效指针(void *)指向任何东西,但它实际上不是一种推荐的方法(你怎么知道将它取消引用呢?)。
答案 3 :(得分:1)
将输入读取为文本字符串(字符数组)。然后分析一下:
signed char
,short
,int
,long
,long long
或unsigned
各种各样的)float
或double
或long double
)完成后,将转换后的值放入union的相应成员中并设置类型:
typedef struct
{
int Type; // tells which one of the below holds the value
union
{
signed char sc;
unsigned char uc;
short s;
unsigned short us;
int i;
unsigned ui;
long l;
unsigned long ul;
long long ll;
unsigned long long ull;
float f;
double d;
long double ld;
char* str;
char ch;
} Value;
} tValue;
请注意,看起来像整数的内容可能不适合最大的整数类型,在这种情况下,您可以选择将其转换为浮点值,可能会丢失精度。否则你可能会说这是一个错误并适当地处理它。
此外,在转换浮点数时,您可能应首先使用较大的类型(long double
),然后尝试下一个较小的类型(double
然后float
)以查看值是否为在这两种情况下都是相同的,在这种情况下,您可以选择较小的类型。
答案 4 :(得分:0)
使用void指针存储变量的地址和类型转换,以便为“每个”类型返回它。联盟你还必须事先知道你将要使用的类型。 要在宏中使用,请查找gcc typeof