同じアドレスを持つ 2 つの異なる変数 (x と y など) を宣言するにはどうすればよいですか?
printf("%p\n",&x); /*will be same */
printf("%p\n",&y);
なしで可能であればunion
?
同じアドレスを持つ 2 つの異なる変数 (x と y など) を宣言するにはどうすればよいですか?
printf("%p\n",&x); /*will be same */
printf("%p\n",&y);
なしで可能であればunion
?
@Mysticialの発言は正しいです。ユニオン要素はメモリ空間を共有します。ユニオン内の2つの変数の開始アドレスは同じです。以下は私のサンプルプログラムであり、その出力はあなたが理解するのに役立つかもしれません。
#include<stdio.h>
union u{
int x;
int y;
};
union u a;
int main(){
printf("\n %p %p\n",&a.x, &a.y);
return 1;
}
出力:
~$ ./a.out
0x601030 0x601030
さらに、@ Alonのアイデアとして、C ++には、他の変数のエイリアスである参照変数と呼ばれるもう1種類の変数があります。次のように作成できます:(質問にはCのタグが付けられ、Cでは参照変数がありません)以下を参照してください:
int a = 10;
int &b = a;
+----+----+
| 10 | <--- a = b
+----+----+
2002
印刷&a
してから同じ&b
ようになります2002
。
あなたが要求した正確なことは、言語の標準機能だけを使用して行うことはできませんが、一部のコンパイラにはそれを許可する拡張機能があります。たとえば、GCC を使用すると、必要なことが実行される可能性があります (ドキュメントはこちら)。
#define ASMNAME(x) ASMNAME_(__USER_LABEL_PREFIX__, #x)
#define ASMNAME_(x,y) ASMNAME__(x, y)
#define ASMNAME__(x,y) __asm__(#x y)
int x;
extern int y ASMNAME(x);
int main(void)
{
return !(&x == &y); /* will exit successfully */
}
ただし、これがどのような影響を与えるかに注意してください。オブジェクト ファイルには変数が 1 つしかなく、その名前はx
. y
ソース コードで別の名前として宣言されているだけです。これは、何をしようとしているのかによって、十分な場合と不十分な場合があります。
2 つの変数は、最適化のために別個のものとして扱われることにも注意してください。例えば:
#define ASMNAME(x) ASMNAME_(__USER_LABEL_PREFIX__, #x)
#define ASMNAME_(x,y) ASMNAME__(x, y)
#define ASMNAME__(x,y) __asm__(#x y)
int x;
extern int y ASMNAME(x);
#include <stdio.h>
int main(void)
{
int a, b;
x = 1;
a = x;
y = 2;
b = x;
printf("a=%d b=%d x=%d y=%d\n", a, b, x, y);
return 0;
}
印刷してもよい
a=1 b=1 x=1 y=2
へのストアy
は の値に影響を与えるとは見なされないためですx
。
変数を宣言するとき(そして(コンパイラがそれらをレジスタとして扱うことを決定できないように)それらのアドレスを読み書きする何かをするとき)、純粋なCであなたが望むことをする方法はありません。 。cppの栄光の参照またはユニオンがなければ、2つの変数が同じスペースを占めることはできませんが、1つの変数とそれへの多数のポインターを持つことができます。
type1 var1;
type2 * var2 = &var1;
しかし、最終的には、メモリの一部をさまざまなタイプとして扱いたい場合は、通常、次のようにします。
void * var = &something;
そして、次のように使用します。
*(int*)var
int *p=NULL;
*p=value1; ,
印刷して *p=value2;
使う