是否可以创建变量名称数组?

时间:2016-01-21 22:52:10

标签: c

我有一个变量表。

int var1;
int var2;
int var3;

我想通过名称显式访问这些变量的值,如var1 = 3;或数组(在for循环中):

for (i = 0; i < sizeof(vars_array) / sizeof(int); i++)
{
    vars_array[i] = nnn;
}

我怎样才能做到这一点?

3 个答案:

答案 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来成对存储和检索数据。

如果变量只是简单编号为var1var2var3 ...则代替使用单个变量,将值放在数组中。

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;
}

Here's a good tutorial on using Gnome Lib