1

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

4

4 回答 4

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;

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

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

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

于 2012-09-11T08:29:22.587 回答
2

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

于 2012-09-11T08:32:22.033 回答
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。

于 2012-09-11T08:43:32.140 回答
0

您可以考虑代码生成。

使用 XML:

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

生成代码:

int abc;

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

于 2012-09-11T08:52:50.110 回答