我是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=#
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
答案 0 :(得分:1)
将变量传递给函数时,只传递此变量的值。您永远不会传递地址,因为在该函数中创建了 new 变量。您在函数签名中看到的参数都是局部变量,就像您在函数体中编写它们一样。这些参数用您调用函数时传递的值填充 - 但同样,您只是将值传递给 new 变量。
void function(int a) { printf(a); }
int a = 5;
function(a);
在此示例中,存在两个具有完全不同地址的不同变量。它们具有相同的值(即5),但它们的地址非常不同。
在您的调试功能中也是如此:num
与num
中的main
不同,它们具有相同的值(因为您在num
中将“main
num
的值”debug
给了num_p
,但不是同一地址。现在,debug_p
中的num
仍指向main
中的num
,debug
中的 指向{{1}},地址不同。
答案 1 :(得分:0)
num
和num_p
在两个函数中具有相同地址的原因是由于堆栈的工作原理:第一次调用debug
会在堆栈上分配一个变量。然后,当函数返回时,再次释放堆栈。现在你调用debug_p
,因此分配了另一个变量。它将像以前一样在内存中使用相同的位置,因为堆栈是以相同的方式构建的。