两个变量的地址相同?

时间:2013-03-23 18:50:45

标签: c

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

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

如果可能,没有union

4 个答案:

答案 0 :(得分:8)

您要求的确切内容无法仅使用该语言的标准功能,但某些编译器具有允许它的扩展名。例如,使用GCC,这可能会做你想要的(documentation here)。

#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 */
}

请注意它有什么影响:在目标文件中,只有一个变量,其名称为xy仅在源代码中声明为它的另一个名称。根据你想要做的事情,这可能会或可能不会很好。

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

#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的价值。

答案 1 :(得分: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;
}

输出:

~$ ./a.out 

0x601030 0x601030

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

int a = 10;
int &b = a; 

+----+----+
|   10    |  <--- a = b
+----+----+  
  2002         

如果您打印&a&b,那么您将获得2002相同的内容。

答案 2 :(得分:4)

当你声明变量(并做一些会读/写它们的地址[以便编译器不能决定将它们作为寄存器处理])时,没有办法在纯C中做你想做的事情。)它们被分配了记忆中的房间。如果没有cpp的美化引用或联合,你不能让2个变量占用相同的空间,你可以拥有一个变量和一些指针:

type1 var1;
type2 * var2 = &var1;

但最终当我想将一块内存视为不同的类型时,我通常会这样做:

void * var = &something;

然后就像使用它一样:

*(int*)var

答案 3 :(得分:1)

int *p=NULL;  
    *p=value1; , 

打印*p=value2;,使用它