Skip to content
Permalink
Branch: master
Find file Copy path
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
45 lines (36 sloc) 1.43 KB
title tags categories date
C语言中返回自己的函数
C
奇技淫巧
计算机
2016-12-09 15:47:31 -0800

偶然看到这样的一道题:

怎样在C语言中写出一个函数,它返回指向自己的指针呢?也就是说,设法使下面的程序通过编译且正常运行:

typedef (在此写出FuncPtr的原型); (在此补全代码) int main() { FuncPtr f1 = f(); // 调用f FuncPtr f2 = f1(); // 又调用f FuncPtr f3 = f2(); // 又调用f // 无论再写多少行也不会有问题 return 0; }


如果禁止使用隐式类型转换,那么显然是不可能写出f准确的原型的。Stack Overflow上面类似的问题下方回答也是清一色的“做不到”。但是我还是找到了一个解,它能满足题目要求。

<!--more-->这个解很简单,它依赖于C会隐式地将`void*`类型转换为任何指针类型的特性:

```C
typedef void *(*FuncPtr)();

void *f() { return f; }

int main() {
    FuncPtr f1 = f();
    FuncPtr f2 = f1();
    FuncPtr f3 = f2();
    return 0;
}

顺便一提,这道题目本身还用到了C的一个隐式类型转换:调用指向函数的指针等价于调用其所指向的对象,因此不用写(*f1)()而只需写f1()。我给出的这段程序为了简洁,利用了另一个C的隐式类型转换:将函数赋值给指针时会自动对其取地址,因此不用写return &f而只需写return f

You can’t perform that action at this time.