我很困惑!以下所有printf都是打印函数地址的正确方法? 让我告诉你我的困惑。每次我运行所有这些的printf的(也就是第一个printf的,第二个printf和第三的printf)的,在输出我得到 02D4 02D4 02D4 但如果我删除或第一和第二的printf的评论,我得到如下因素作为输出 02BA 当我删除第三printf语句,我得到下面的输出 02D0 当我再次取消注释所有这三个,我得到: 02D4 02D4 02D4 为什么一个语句影响其他的printf线的输出? 这不是功能的地址吗? 我听说s和& s给出了与地址相同的值(就像数组一样)。但在这里我很困惑,为什么s和& s受到影响,当我尝试打印b也是,其中b = s或& s。与功能地址混淆c
#include<stdio.h>
#include<conio.h>
int s(int);
void main()
{
int a=10,*b;
clrscr();
b=s(a++);
b=&s;
printf("%p\n",s); // 1st printf
printf("%p\n",&s); //2nd printf
printf("%p\n",b); //3rd printf
getch();
}
int s(int x)
{
return x;
}
你不应该把一个函数指针放入一个变量指针(它们不能保证是相同的大小),但除此之外它看起来没问题。 C语言的一个特例是没有'&'的函数名称隐式获得(我个人更喜欢总是使其明确) – Dave
(尽管如此,就像不应该将函数指针转换为变量指针,你不应该使用'%p'格式。看到这个答案是一个安全的方式来打印一个函数指针:http://stackoverflow.com/a/2741896/1180785) – Dave
至于为什么你的地址改变,这是因为你正在重新编译脚本!即使您完全没有对代码进行任何更改,它们在编译之间也可能会有所不同。 – Dave