【发布时间】:2010-11-29 04:03:40
【问题描述】:
在以下代码中:
/* mylog.c */
#include <stdio.h>
#include <stdlib.h> /* for atoi(3) */
int mylog10(int n)
{
int log = 0;
while (n > 0)
{
log++;
n /= 10;
}
return log;
}
int mylog2(int n)
{
int log = 0;
while (n > 0)
{
log++;
n >>= 1;
}
return log;
}
int main(int argc, const char* argv[])
{
int (*logfunc)(int); /* function pointer */
int n = 0, log;
if (argc > 1)
{
n = atoi(argv[1]);
}
logfunc = &mylog10; /* is unary '&' operator needed? */
log = logfunc(n);
printf("%d\n", log);
return 0;
}
排队
logfunc = &mylog10;
我注意到一元&(地址)运算符是可选的,无论有没有它,程序的编译和运行方式都是相同的(在带有GCC 4.2.4的Linux中)。为什么?这是编译器特定的问题,还是编译器接受了两种不同的语言标准?谢谢。
【问题讨论】:
-
顺便说一句-这是否意味着函数指针“行为方式与对函数的引用相同”?
-
@Kos:它在源代码级别的行为可能看起来相同,尽管相似之处纯粹是肤浅的:底层抽象语言机制相当不同。然而,如果您深入挖掘并查看机器级别的机制,您会发现它们似乎再次相同。
标签: c gcc function-pointers