我有一个变量表。是否可以创建一个变量名称数组?
int var1;
int var2;
int var3;
我想明确地通过名称来访问这些变量的值,比如var1 = 3;
或作为阵列(在for
环路):
for (i = 0; i < sizeof(vars_array)/sizeof(int); i++)
{
vars_array[i] = nnn;
}
我怎样才能做到这一点?
我有一个变量表。是否可以创建一个变量名称数组?
int var1;
int var2;
int var3;
我想明确地通过名称来访问这些变量的值,比如var1 = 3;
或作为阵列(在for
环路):
for (i = 0; i < sizeof(vars_array)/sizeof(int); i++)
{
vars_array[i] = nnn;
}
我怎样才能做到这一点?
不能使用:
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;
}
不,你不能做到这一点。 (注意:你可以用一些可怕的内存映射把它关掉,不要这样做)。您通常希望避免通过名称动态引用变量,即使语言允许。它使理解代码非常困难。你想要的是一个数组或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;
}
感谢您的信息。我会看看教程 –
当然可以。您将需要一个联盟:“名”
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;
}
好的,但我决定尝试一个你知道的新事物。 – AnArrayOfFunctions
我更新了我的答案。现在一定没问题。 – AnArrayOfFunctions
你能解释一下使用情况? –
简答:第 –
为什么你首先使用单独的变量而不是数组? – Barmar