http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48545
--- Comment #4 from Dmitry Gorbachev <d.g.gorbachev at gmail dot com> 2011-04-11 18:45:50 UTC --- *output and output have different types, but numberically they are equal. That's how C works. More fun: extern int printf(const char *, ...); char str[4] = "abc"; int main(void) { int (*f)(const char *, ...) = &printf; int (*g)(const char *, ...) = printf; char (*p)[4] = &str; char *q = str; (*f)("%p %p %p %p %p %p\n", &printf, printf, f, *f, g, *g); f("%p %p %p %p %p %c\n", &str, str, p, *p, q, *q); return 0; } It prints: 0x80482d8 0x80482d8 0x80482d8 0x80482d8 0x80482d8 0x80482d8 0x8049624 0x8049624 0x8049624 0x8049624 0x8049624 a