C 两个变量的相同地址?

C 两个变量的相同地址?,c,C,如何声明具有相同地址的两个不同变量(例如x和y) printf("%p\n",&x); /*will be same */ printf("%p\n",&y); 如果没有联合?在纯C语言中,如果可能的话,当您声明变量(并执行一些将读取/写入其地址的操作[以便编译器无法决定将其视为寄存器])时,就无法实现您想要的功能。它们在内存中被分配了空间。如果没有cpp的美化引用或联合,您不能让两个变量占用同一空间,您可以有一个变量和多个指向它的指针: type1 var1;

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

   printf("%p\n",&x);  /*will be same */
   printf("%p\n",&y);

如果没有
联合

在纯C语言中,如果可能的话,当您声明变量(并执行一些将读取/写入其地址的操作[以便编译器无法决定将其视为寄存器])时,就无法实现您想要的功能。它们在内存中被分配了空间。如果没有cpp的美化引用或联合,您不能让两个变量占用同一空间,您可以有一个变量和多个指向它的指针:

type1 var1;
type2 * var2 = &var1;
但最终,当我想将一段内存视为不同类型时,我通常只会这样做:

void * var = &something;
然后像这样使用它:

*(int*)var

打印它
*p=value2,使用它。

什么@神秘的说法是正确的。联合元素共享内存空间。联合中的两个变量具有相同的起始地址。下面是我的示例程序,它的输出可能会帮助您理解

#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;
}

另外,在C++中,作为@ Alon思想,你还有一种变量称为引用变量,是其他变量的别名。您可以创建如下内容:(您的问题标记为C,在C中您没有参考变量)请参见以下内容:

int a = 10;
int &b = a; 

+----+----+
|   10    |  <--- a = b
+----+----+  
  2002         
inta=10;
int&b=a;
+----+----+

|10 |您要求的精确操作不能仅使用该语言的标准工具来完成,但有些编译器有允许它的扩展。例如,使用GCC,这可能会满足您的需要()

但是,请注意这有什么影响:在对象文件中,只有一个变量,其名称是
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;
}


因为存储到
y
不会影响
x

的值,并且您不需要指针?是的。这是一种方法,但我不想使用联合。如果你不想使用指针,这是不可能的,你要问的是引用变量(c++),你用指针的解决方案是什么?我不关心X和Y的类型,我只关心它们位于同一个地址。对于引用变量,可以使参数变量与参数变量位于同一个地址。即使不进行函数调用,我也要做同样的事情。我希望有办法。我要求助于一个论点来解决这个限制。谢谢你的回答,但是这是可能的,没有工会。这是事实,但是X和Y不是两个不同的变量——联合是变量。在C++中,C.不是可以引用的。在C++中,变量是定义为唯一的地址。我目前还不知道有两个地址相同的变量:)@TylerMcHenry是的,更正了我在回答中写的相同内容,我从他那里得到了一个想法,多亏了他。@XTG你没有为
*p
分配内存,所以给
*p
的赋值是未定义的行为。并可能导致seg故障。@Grijesh Chauhan您可以实际检查它。@XTG需要一些时间重新考虑…尽管您写的是错误的或不完整的。@Grijesh Chauhan请确定我是错误的或不完整的,并尝试运行它。@Farseer请阅读编辑后的答案,确保它确实符合您的要求。确实如此。非常感谢,扎克!在颠覆C语言方面做得很好。滥用extern关键字和少量asm。。。不错的解决方案,但毫无疑问是有问题的。@dingrite它是一个非常古老的GCC扩展,完全不是我的发明。公认的是,
\uuuu用户\u标签\u前缀\uuuuu
gunk没有很好的文档记录;我认为最初的目的是使在默认情况下使用前缀的系统上,可以不使用前缀来命名事物。
int a = 10;
int &b = a; 

+----+----+
|   10    |  <--- a = b
+----+----+  
  2002         
#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 */
}
#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