C 我怎样才能得到这个地址?

C 我怎样才能得到这个地址?,c,pointers,memory-address,C,Pointers,Memory Address,我有这个: unsigned int y = (unsigned int)(int*)foo; 如何获取存储在foo指向的内存值中的地址 让我们试着更好地解释,假设thery是int类型: int x = 10; int *foo = &x; unsigned int y = (unsigned int)(int*)foo; int r = MAGIC(y); /* should be 10 */ x = 13; /* r still should be 10 */ y应该包含x

我有这个:

  unsigned int y = (unsigned int)(int*)foo;
如何获取存储在
foo
指向的内存值中的地址

让我们试着更好地解释,假设thery是int类型:

int x = 10;
int *foo = &x;
unsigned int y = (unsigned int)(int*)foo;
int r = MAGIC(y); /* should be 10 */
x = 13; /* r still should be 10 */
y
应该包含x的地址,即
10
整数的地址

r
应该复制
y
位置的值,它是,
10
整数

因此,
x
(如
x=13
)的任何更改都不应更改值
r
。这只是一个int


问题是:我如何定义
MAGIC

如果你想要的是可能的,那么

#define MAGIC(y) (*((int*)(y)))

我会的。

如果你想要的是可能的,那么

#define MAGIC(y) (*((int*)(y)))

就可以了。

如果y要保留x的地址,则应声明为:

unsigned int *y;
魔术应该仅仅是操作员所指的东西

int r = *y;

魔法只是星号。

如果y代表x的地址,则应声明为:

unsigned int *y;
魔术应该仅仅是操作员所指的东西

int r = *y;

MAGIC只是一个星号。

您的代码试图使用
y
作为指针,而实际上它被定义为
无符号整数。在“糟糕的老时光”中编写的代码可以做类似于您的示例的事情

代码的意图应该更加明确和明确,因此:

    #include <stdlib.h>
    main()

    {
    int x = 10;
    int *foo = &x;

    int *y = foo;

        #define MAGIC(A) *A
    int r = MAGIC(y); /* should be 10 */

    x = 13; /* r still should be 10 */

    printf("x=%d, r=%d", x, r);
        // printed (as expected) :: x=13, r=10

     }
#包括
main()
{
int x=10;
int*foo=&x;
int*y=foo;
#定义魔术(A)*A
int r=MAGIC(y);/*应该是10*/
x=13;/*r仍应为10*/
printf(“x=%d,r=%d”,x,r);
//打印(如预期):x=13,r=10
}
现在,没有理由去研究C编译器


如果您正在维护一些与原始示例类似的旧代码,那么使用今天的编程风格重新编写它可能是值得的。注意,它仍然可以用C写,只是格式良好的C

您的代码试图使用
y
作为指针,而实际上它被定义为
无符号整数
。在“糟糕的老时光”中编写的代码可以做类似于您的示例的事情

代码的意图应该更加明确和明确,因此:

    #include <stdlib.h>
    main()

    {
    int x = 10;
    int *foo = &x;

    int *y = foo;

        #define MAGIC(A) *A
    int r = MAGIC(y); /* should be 10 */

    x = 13; /* r still should be 10 */

    printf("x=%d, r=%d", x, r);
        // printed (as expected) :: x=13, r=10

     }
#包括
main()
{
int x=10;
int*foo=&x;
int*y=foo;
#定义魔术(A)*A
int r=MAGIC(y);/*应该是10*/
x=13;/*r仍应为10*/
printf(“x=%d,r=%d”,x,r);
//打印(如预期):x=13,r=10
}
现在,没有理由去研究C编译器


如果您正在维护一些与原始示例类似的旧代码,那么使用今天的编程风格重新编写它可能是值得的。注意,它仍然可以用C写,只是格式良好的C

不,这不是问题。问题是,如果您已经有了
foo
,为什么要这样做?使用整数存储地址肯定会在某个时候出错。我的意思是,如果你在一个地址是64位而无符号整数只有32位的系统上,那会怎么样?这就是为什么
intptr\t
存在的原因。事实上,我知道这一点。。。因为我只是在测试它,所以我没有让所有的代码都可以移植。还有我以前用过的
ptrdiff\t
。不,这不是问题所在。问题是,如果您已经有了
foo
,为什么要这样做?使用整数存储地址肯定会在某个时候出错。我的意思是,如果你在一个地址是64位而无符号整数只有32位的系统上,那会怎么样?这就是为什么
intptr\t
存在的原因。事实上,我知道这一点。。。因为我只是在测试它,所以我没有让所有的代码都可以移植。我以前也使用过
ptrdiff\u t
。作者的意图是将裸地址保存在“无符号int”中而不是指针中。无法保证无符号int与指针的长度相同,因此这是一个危险的意图
intptr\u t
是一种整数类型,它保证足够大以存储指针。作者的意图是将裸地址保存在“无符号整数”中而不是指针。不保证无符号整数与指针的长度相同,因此这是一种危险的意图
intptr\u t
是一种整数类型,保证足够大以存储指针。