如何声明具有相同地址的两个不同变量(比如x和y)?
printf("%p\n",&x); /*will be same */
printf("%p\n",&y);
Run Code Online (Sandbox Code Playgroud)
如果可能没有union?
您要求的确切内容不能仅使用该语言的标准工具来完成,但某些编译器具有允许它的扩展.例如,使用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.
什么@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相同的.
| 归档时间: |
|
| 查看次数: |
5388 次 |
| 最近记录: |