如何声明具有相同地址的两个不同变量(比如x和y)?
printf("%p\n",&x); /*will be same */
printf("%p\n",&y);
如果可能,没有union
?
答案 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 */
}
请注意它有什么影响:在目标文件中,只有一个变量,其名称为x
。 y
仅在源代码中声明为它的另一个名称。根据你想要做的事情,这可能会或可能不会很好。
另请注意,出于优化目的,这两个变量被视为 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;
,使用它