1

例: 変数があるように、char str[3]="abc";この "abc" を別の変数 (整数など) の名前として使用して、任意の値を に格納できますabc。はいの場合、次のように「abc」に値を保存しているときに、 int abc=123; abc を参照して 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 に答える