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
是一种整数类型,保证足够大以存储指针。