使用printf()函数在C中编写函数名时打印的是什么

使用printf()函数在C中编写函数名时打印的是什么,c,function,C,Function,当我编写此代码时: #include <stdio.h> int main() { printf("%p\n",main); printf("%d\n",main); return 0; } 我很想知道实际印刷的是什么。我用谷歌搜索了我的问题,但什么也没找到( 提前感谢。main是类型为int(*)(void) printf(“%p\n”,main); 您正在打印该指针的地址,该指针在您的平台上已成功转换为void*。如果sizeof(main)==siz

当我编写此代码时:

#include <stdio.h>

int main()
{
    printf("%p\n",main);
    printf("%d\n",main);
    return 0;
}
我很想知道实际印刷的是什么。我用谷歌搜索了我的问题,但什么也没找到(

提前感谢。

main
是类型为
int(*)(void)

  • printf(“%p\n”,main);
  • 您正在打印该指针的地址,该指针在您的平台上已成功转换为
    void*
    。如果
    sizeof(main)==sizeof(void*)
    ,则这将很好

  • printf(“%d\n”,main);

  • 这将给您提供未定义的行为,因为
    %d
    不是指针类型的良好格式说明符。

    这不是定义良好的

    您使用的是
    %p
    ,它需要一个类型为
    void*
    的参数,但实际上您是在向它传递一个类型为
    int(*)(
    )的值,即(定义也很糟糕的)
    main()
    函数

    您无法将函数指针转换为可移植的
    void*
    ,因此您的代码永远不会正确

    在大多数典型的系统上,
    sizeof(void*)==sizeof main
    ,因此您只需将该值解释为一个
    void*
    ,它可能就是函数的地址

    使用格式说明符
    %d
    将函数地址传递给
    printf()
    ,情况更糟,因为很可能是
    sizeof(int)!=sizeof main
    ,然后得到未定义的行为


    这不是好代码。

    第一个打印函数的地址,如果
    sizeof(void*)
    等于
    sizeof(int),第二个打印函数的地址
    在您的平台上,但这通常被认为是未定义的行为。@TheBigH,我不知道函数指针这一术语。并非巧合,0x401318==4199192。关于%d说明符有什么关系?OP正在打印指针的值(函数的地址),而不是指针的地址。此外,只有当
    sizeof(void*)
    等于
    sizeof(int)时,才能保证对
    printf
    的第二次调用正常工作
    在OP的平台上,但这通常被认为是未定义的行为。最后一件事——我不是对你的答案投反对票的人,所以请不要对我自己的随机答案投反对票。它们是相同的值。
    %p
    将其格式化为十六进制,
    %d
    将其格式化为十进制。
    0x401318==4199192
    @robert:那不是真的。例如,如果OP在64位平台(64GB内存地址空间)上运行,那么
    %p
    将相当于
    %lld
    (或者更准确地说,相当于
    %llx
    )。但对“
    %p
    的否决票应该可以。函数指针与
    void*
    指针不兼容。
    00401318
    4199192