2016-01-21 117 views
1

我有一个变量表。是否可以创建一个变量名称数组?

int var1; 
int var2; 
int var3; 

我想明确地通过名称来访问这些变量的值,比如var1 = 3;或作为阵列(在for环路):

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

我怎样才能做到这一点?

+2

你能解释一下使用情况? –

+3

简答:第 –

+1

为什么你首先使用单独的变量而不是数组? – Barmar

回答

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

你假设sizeof(int)== 1。这可能是不正确的。 – jforberg

+1

更好的方法是用'NULL'结束'vars_array'并检查'vars_array [i]!= NULL'。 – Schwern

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

Here's a good tutorial on using Gnome Lib

+0

感谢您的信息。我会看看教程 –

1

当然可以。您将需要一个联盟:“名”

union { 
struct { 
    int var1, var2, var3; 
}; 
int vars_array[3]; 
}name; 

尽管这样,你应该用你的前缀变量实例。出于某种原因,您不能省略它并将封装空间中的标识符(作为未命名的结构和联合成员)导出。

您的访问数组元素(这直接映射到你的变量 - 最终?)代码应该是这样的:

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

好的,但我决定尝试一个你知道的新事物。 – AnArrayOfFunctions

+0

我更新了我的答案。现在一定没问题。 – AnArrayOfFunctions

相关问题