在C程序中,我们可以将变量的名称变为变量吗?

时间:2012-09-11 08:27:53

标签: c

例如:就像我有一个变量char str[3]="abc";那么我可以使用这个“abc”作为另一个变量的名称(比如一个整数),这样我就可以在abc中存储任何值。 如果是,那么在'abc'中存储值时,如下所示: int abc=123; 我可以通过str引用abc作为变量吗?

4 个答案:

答案 0 :(得分:5)

没有。你所谈论的是反思,一种访问环境内部细节的方法。 C目前没有内置到该语言中。

有一些方法可以实现相同的效果,例如从字符串到整数指针的映射数据结构,但它有点混乱。作为一个示例:

int abc, def;
char *strName[] = {"abc", "def"};
int *address[] = { &abc, &def};
:
char *key = "def";
int newVal = 42;

for (i = 0; i < sizeof (strName) / sizeof (*strName); i++)
    if (strcmp (key, strName[i]) == 0)
        *(address[i]) = newVal;

这将通过键列表,直到找到匹配的键,然后使用地址列表中的等效指针来修改变量。

但是,老实说,一旦你不得不做一些黑暗和狡猾的事情,你可以用更合适的数据结构来做。

例如,一个地图,其中的值存储在实际地图中,而不是保存“外部”整数的地址。

答案 1 :(得分:2)

不仅你不能,而且它是C语言的意识形态的一部分。变量名在运行时不存在,变量内容在编译时不重要。

答案 2 :(得分:0)

通过查看源代码以及运行原始二进制可执行文件时“程序本身看到的”,您对程序的看法有所不同。在可执行文件中,没有变量名这样的东西。

假设我们有这个计划:

char str[4]="abc"; // note that you need to allocate 4 bytes
int abc=123;

以上是源代码,这是程序员看到的。程序本身只“看到”类似的东西:

在某个地址0x12345678处,有4个字节。它们是0x61,0x62,0x63,0x00(ASCII码)。由于源代码中的char类型,程序将以单个字节的形式访问这些内容。但该程序实际上也没有看到类型。

然后在地址0x1234567C,内存中进一步向下4个字节,我们有另外4个字节(假设32位CPU)。它们包含值0x0000007B(123)。程序只将这个int变量引用为0x1234567C,它不知道程序员在源代码中将其称为abc。

答案 3 :(得分:0)

您可以考虑代码生成。

使用XML:

<var type="int" name="abc" />

生成代码:

int abc;

(输入XML本身本身可以使用char str []作为输入创建