【发布时间】:2013-12-02 00:18:21
【问题描述】:
我现在已经阅读了至少十几篇关于 %p 的文章,但我仍然没有得到明确的答案。我意识到网站上有很多关于这个的帖子,我读了很多。 I even read this article, but it did not explain it adequately
说我有:
int x = 10;
void *p = &x;
下面的语句是打印出'p'的地址还是'x'的地址?
printf( "Here: %p\n" , p );
我正在尝试通过p获取x的地址。
对于某些上下文,我正在迭代堆栈以寻找指向我创建的链表的指针:
void foo(){
register void* base asm("ebp");
void* iter = base;
void* mBase = MAIN_BASE; //global defined as "register void* base asm("ebp")" in main function
void* start = &head;
void* fin = &tail + sizeof( tail );
while( iter != mBase ){
if( iter >= start && iter <= fin )
fprintf( stdout, ">>>>%p\n", iter );
printf("iter: %p\n", iter );
iter = (void*)( (char*)iter + 1 );
}
}
【问题讨论】:
-
打印变量“p”的值,即“p”所指向的东西的地址。
-
对吗?因为在我提供的示例中,“iter”的打印总是按顺序排列,如果它返回指针的目标,我不应该看到一些变化吗?
-
谁说
p必须存储在堆栈中?您的编译器可能会对其进行优化,并且只会将p存储在寄存器中。 -
有两个例子,我说的是
iter,不是p -
“指针的目标”是指针值寻址的存储位置。当您将 iter 增加 1 时,打印的地址将增加 1。(当然,该地址处的“对象”可能不是任何类型的有效对象,实际上甚至可能没有分配存储空间。)