了解 returns 指向数组的指针函数

Understanding a pointer function that returns a pointer to an array

所以,我只是想围绕“return 是一个指向数组的指针的指针函数”...但是为了慢慢开始,我必须理解这一点:

void Print(const char c){
    printf("\nPrint: %c\n", c);
}

int main () {
    void (*FunctionPointer)(const char);
    FunctionPointer = &Print;
    FunctionPointer('a');
}

我这样做 - 很容易猜到发生了什么...... FunctionPointer 只是指向 Print 函数“驻留”的位置。我现在可以更灵活地指向我想访问的任何函数,而不是跳转到特定函数的特定内存地址(存储在寄存器中)。

但我坚持以下...

int main () {
    int (*FunctionPointer())[];
}

现在看来,FunctionPointer指向的函数,其实可以return一个指向int类型数组的指针。编译器接受第二行 - 到目前为止一切顺利 - 我也理解这个概念......但我在实现方面遇到了困难。

FunctionPointer 需要 - 再次指向一个函数。该函数确实可以 return 一个指向 int 类型数组的指针...soooooo:

int *Array(){
    int ar[2] = {5,6};
    return ar;
}

int main () {
    int (*FunctionPointer())[];
    FunctionPointer = &Array;
}

然而,最后一段代码只是不被编译器接受....所以,是什么给了?

您已经声明了函数指针数组。数组不能赋值。函数不能 return 数组。你可能希望

int* (*FunctionPointer)();
FunctionPointer = &Array;

int (*FunctionPointer())[];

您已将 FunctionPointer 声明为 函数 return 指向 int 数组的指针 -- 而不是函数指针。你要

int *(*FunctionPointer)();

如果你在这里使用 [],你会得到一个错误,因为函数不能 return 数组——数组不是第一个 class 类型——并且不像 with函数参数,当用作函数类型的 return 值时,数组不会自动转换为指针。这样,您仍然会收到警告

t.c:3:12: warning: function returns address of local variable [-Wreturn-local-addr]
     return ar;
            ^~

漂亮self-explanatory

当您使用 typedef 时,函数指针会更容易。您可以简单地使用与“普通”数据指针相同的表示法。

// func is a function type. It has one parater and returns pointer to int
typedef int *func(const char);

// funcptr is a pointer to func
func *funcptr;