2016-01-21 94 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

相關問題