例: 変数があるように、char str[3]="abc";
この "abc" を別の変数 (整数など) の名前として使用して、任意の値を に格納できますabc
。はいの場合、次のように「abc」に値を保存しているときに、
int abc=123;
abc を参照して abc を変数として参照できstr
ますか?
4 に答える
いいえ、あなたが話しているのは、環境の内部の詳細にアクセスする方法であるリフレクションです。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;
これは、一致するキーが見つかるまでキーのリストを調べてから、アドレスのリストで同等のポインターを使用して変数を変更します。
しかし、正直なところ、そのような暗くて悪意のあることをしなければならない場合は、より適切なデータ構造でそれを行うこともできます。
たとえば、値が「外部」整数のアドレスを保持するのではなく、実際のマップに格納されるマップ。
できないだけでなく、それは C 言語のイデオロギーの一部です。変数名は実行時には存在せず、変数の内容はコンパイル時には重要ではありません。
ソース コードを見てプログラムを確認することと、生のバイナリ実行可能ファイルを実行したときに「プログラム自体が確認すること」には違いがあります。実行可能ファイルには、変数名などはありません。
このプログラムがあるとしましょう:
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 と呼んでいることはわかりません。
コード生成を検討できます。
XML の場合:
<var type="int" name="abc" />
コードを生成します。
int abc;
(入力 XML 自体は、入力として char str[] を使用して作成できます)