检查函数的指针地址和值

时间:2014-12-22 19:58:52

标签: c function pointers

我是C的初学者,并且正在阅读一本名为"理解和使用C指针的书#34;并最终遇到使用printf函数的问题。

使用debug_p时,事实证明指针num_p的地址不同但在调试时精确到num,但在main()中尝试printf时返回正确的值。

我的问题是,为什么会这样?是否有合适的方法在函数中执行printf并具有正确的指针地址?

#include <stdio.h>
void debug(int num)
{
    printf("Address of num: %i Value: %i\n", &num, num);
}

void debug_p(int *num_p)
{
    printf("Address of num_p: %i Value %i\n", &num_p, num_p);

}


int main()
{
int num=11;
int *num_p=&num;
printf("Address of num: %i Value: %i\n", &num, num);
printf("Address of num_p: %i Value: %i\n\n", &num_p, num_p);

debug(num);
debug_p(num_p);
return 0;
}

main()的输出:

Address of num: 2358860 Value: 11
Address of num_p: 2358848 Value: 2358860

从debug输出,然后是debug_p:

Address of num: 2358816 Value: 11
Address of num_p: 2358816 Value 2358860

2 个答案:

答案 0 :(得分:1)

将变量传递给函数时,只传递此变量的。您永远不会传递地址,因为在该函数中创建了 new 变量。您在函数签名中看到的参数都是局部变量,就像您在函数体中编写它们一样。这些参数用您调用函数时传递的值填充 - 但同样,您只是将值传递给 new 变量。

void function(int a) { printf(a); }

int a = 5;
function(a);

在此示例中,存在两个具有完全不同地址的不同变量。它们具有相同的(即5),但它们的地址非常不同。

在您的调试功能中也是如此:numnum中的main不同,它们具有相同的(因为您在num中将“main num的值”debug给了num_p,但不是同一地址。现在,debug_p中的num仍指向main中的numdebug中的 指向{{1}},地址不同。

答案 1 :(得分:0)

numnum_p在两个函数中具有相同地址的原因是由于堆栈的工作原理:第一次调用debug会在堆栈上分配一个变量。然后,当函数返回时,再次释放堆栈。现在你调用debug_p,因此分配了另一个变量。它将像以前一样在内存中使用相同的位置,因为堆栈是以相同的方式构建的。