我有一个变量表。
int var1;
int var2;
int var3;
我想通过名称显式访问这些变量的值,如var1 = 3;
或数组(在for
循环中):
for (i = 0; i < sizeof(vars_array) / sizeof(int); i++)
{
vars_array[i] = nnn;
}
我怎样才能做到这一点?
答案 0 :(得分:3)
你不能使用:
for (i = 0; i < sizeof(vars_array); i++)
{
vars_array[i] = nnn;
}
但是,如果您愿意存储指针数组,则可以使用:
int* vars_array[] = {&var1, &var2, &var3};
for (i = 0; i < sizeof(vars_array)/sizeof(vars_array[0]); i++)
{
*vars_array[i] = nnn;
}
答案 1 :(得分:1)
当然可以。你需要一个工会:
union {
struct {
int var1, var2, var3;
};
int vars_array[3];
}name;
虽然这样你应该在变量实例的前面添加'name。'。由于某种原因,您无法省略它并导出封闭空间中的标识符(作为未命名的结构和联合成员)。
您访问数组元素的代码(直接映射到您的变量 - 最终?)应如下所示:
for (i = 0; i < sizeof(name.vars_array) / sizeof(int); i++)
{
name.vars_array[i] = nnn;
}
答案 2 :(得分:0)
不,你不能这样做。 (注意:您可能可以使用某种可怕的内存映射将其拉下来,不要这样做)。您通常希望避免按名称动态引用变量,即使语言允许它。它使得理解代码变得非常困难。您想要的是一个数组或hash table来成对存储和检索数据。
如果变量只是简单编号为var1
,var2
,var3
...则代替使用单个变量,将值放在数组中。
int vars[] = { 23, 42, 99 };
for( int i = 0; i < 3; i++ ) {
printf("vars%d: %d\n", i, vars[i]);
}
如果变量名不是数字,或者数字不连续,那么一般的想法是使用哈希表。这就像一个数组,但它不使用索引的数字而是使用字符串。查找很快,但它本身没有顺序。
C内置没有哈希,因此您必须使用Gnome Lib之类的库。
#include <glib.h>
#include <stdio.h>
int main() {
/* Init a hash table to take strings for keys */
GHashTable *vars = g_hash_table_new(g_str_hash, g_str_equal);
/* For maximum flexibility, GHashTable expects the keys and
values to be void pointers, but you can safely store
integers by casting them */
g_hash_table_insert(vars, "this", (gpointer)23);
g_hash_table_insert(vars, "that", (gpointer)42);
g_hash_table_insert(vars, "whatever", (gpointer)99);
/* And casting the "pointer" back to an integer */
printf("'this' is %d\n", (int)g_hash_table_lookup(vars, "this"));
g_hash_table_unref(vars);
return 0;
}