如何声明具有相同地址的两个不同变量(例如 x 和 y)?
printf("%p\n",&x); /*will be same */
printf("%p\n",&y);
如果可能没有union
?
如何声明具有相同地址的两个不同变量(例如 x 和 y)?
printf("%p\n",&x); /*will be same */
printf("%p\n",&y);
如果可能没有union
?
@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++ 中,您还有一种称为引用变量的变量是其他变量的别名。你可以像这样创建:(你的问题被标记为 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 */
}
不过请注意这有什么影响:在目标文件中,只有一个变量,它的名称是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;
}
可能会打印
a=1 b=1 x=1 y=2
因为 store toy
不被认为会影响 的值x
。
没有办法在纯 C 中做你想做的事,当你声明变量(并做一些会读/写它们的地址的事情[这样编译器不能决定将它们视为寄存器])时,它们会在内存中分配空间. 如果没有 cpp 的美化引用或联合,就不能让 2 个变量占用相同的空间,但是您可以拥有一个变量和多个指向它的指针:
type1 var1;
type2 * var2 = &var1;
但最终,当我想将一段内存视为不同的类型时,我通常会这样做:
void * var = &something;
然后像这样使用它:
*(int*)var
int *p=NULL;
*p=value1; ,
打印 *p=value2;
,使用