两个变量的地址相同?

Far*_*eer 5 c

如何声明具有相同地址的两个不同变量(比如x和y)?

   printf("%p\n",&x);  /*will be same */
   printf("%p\n",&y);
Run Code Online (Sandbox Code Playgroud)

如果可能没有union

zwo*_*wol 8

您要求的确切内容不能仅使用该语言的标准工具来完成,但某些编译器具有允许它的扩展.例如,使用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 */
}
Run Code Online (Sandbox Code Playgroud)

但请注意它有什么影响:在目标文件中,只有一个变量,其名称是x. y仅在源代码中声明为它的另一个名称.根据您的尝试,这可能会或可能不会很好.

另请注意,出于优化目的,这两个变量被视为不同.例如:

#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;
}
Run Code Online (Sandbox Code Playgroud)

可能很好打印

a=1 b=1 x=1 y=2
Run Code Online (Sandbox Code Playgroud)

因为商店y不被认为会影响价值x.


Gri*_*han 7

什么@Mysticial说的是对的.联盟元素共享内存空间.并且联合中的两个变量具有相同的起始地址.以下是我的示例程序,其输出可能有助于您理解.

#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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

~$ ./a.out 

0x601030 0x601030
Run Code Online (Sandbox Code Playgroud)

另外,作为@Alon的想法,在C++中你还有一种叫做引用变量的变量是其他变量的别名.你可以创建如下:(你的问题是taged C,在C中你没有引用变量)见下文:

int a = 10;
int &b = a; 

+----+----+
|   10    |  <--- a = b
+----+----+  
  2002         
Run Code Online (Sandbox Code Playgroud)

如果打印&a&b那么你会得到2002相同的.