在对语句1进行注释后,此代码正常工作。语句二给出了一些垃圾值,但至少它运行。我没有得到如果它没有作为函数调用,参数中的printf如何给出一个值?
#include<stdio.h>
int main()
{
int printf = 123; // statement one
printf ("%d", printf); // statement two
return 0;
}
答案 0 :(得分:3)
在语句2中,当标识符printf
传递给函数时,它是函数指针 - 指向函数printf
的指针 - 和垃圾值是尝试使用printf
和格式:%d
打印此地址的结果:使用%d
打印指针时应该会看到编译器警告。
答案 1 :(得分:2)
没有括号的函数名称不返回值 - 它计算函数的地址(即,它是size_t (*)(const char *, ...)
类型的函数指针)。从本质上讲,这是每当遇到printf()
调用时CPU将在指令之间跳转的地址。
顺便说一句,如果我没记错的话,分配给函数的名称是未定义的行为,那么使用%d
格式说明符打印指针 - 你应该使用
printf("%p", (void *)printf);
另外,你可以声明函数指针,为它们分配另一个函数的地址并调用它们就好了:
size_t (*my_printf)(const char *, ...) = printf;
my_printf("This actually called printf!\n");
printf("my_printf: %p\n", (void *)my_printf);
printf("original printf: %p\n", (void *)printf);
最后两个语句打印相同的地址。
编辑:严格来说,即使是上述“解决方案”也是非标准的,因为标准并不保证函数指针可以转换为数据指针类型。这意味着基本上没有办法打印函数的地址,但是,在大多数系统上,转换为void *
显然有效。