6

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

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

如果可能没有union

4

4 回答 4

8

@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相同的。

于 2013-03-23T19:01:46.817 回答
8

您要求的精确操作不能仅使用该语言的标准工具来完成,但一些编译器具有允许它的扩展。例如,使用 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

于 2013-03-23T19:08:40.833 回答
4

没有办法在纯 C 中做你想做的事,当你声明变量(并做一些会读/写它们的地址的事情[这样编译器不能决定将它们视为寄存器])时,它们会在内存中分配空间. 如果没有 cpp 的美化引用或联合,就不能让 2 个变量占用相同的空间,但是您可以拥有一个变量和多个指向它的指针:

type1 var1;
type2 * var2 = &var1;

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

void * var = &something;

然后像这样使用它:

*(int*)var
于 2013-03-23T18:54:24.573 回答
1
int *p=NULL;  
    *p=value1; , 

打印 *p=value2;,使用

于 2013-03-23T18:56:08.860 回答