printf中的寻址操作符将函数指针的地址从常规地址更改为0x1000。为什么会发生这种情况,这意味着什么?
#include <stdio.h>
int main()
{
int (*fp) (int);
printf("%p\n", (fp));
printf("%p", (fp));
}
当我运行这个时,我得到了0x560cb44ce060 0x560cb44ce060
,正如预期的那样,但是当我运行这个时,我得到了0x560cb44ce060 0x560cb44ce060
。
#include <stdio.h>
int main()
{
int (*fp) (int);
printf("%p\n", (fp));
printf("%p", &(fp));
}
i get 0x1000 0x7ffcc92c8990
我真的不知道当我在最后一行添加&
运算符时会发生什么变化。
2条答案
按热度按时间0g0grzrc1#
在使用
printf
的第一种情况下,输出未初始化的指针fp
(其垃圾值)在使用printf的第二种情况下,输出指针
fp
本身的有效地址所以什么都没变。输出两个不同的实体:存储在变量(指针)中的值和变量本身的地址。
请注意,转换说明符
p
需要void *
类型的指针,但函数指针可能不会转换为void *
类型。odopli942#
也许你混淆了指针指向的地址和指针的地址。
第一个%p将输出fp保存的地址(尽管它是垃圾值,因为你没有初始化它),第二个将输出fp的地址。