C ++如何将数组理解为指针的观点?

我在下面编写了这段代码,但是当我尝试返回一些二维数组时,它将引发以下错误。

    int (* function (int input[2][2]) ) [2][2]{

        return input;

    }

gcc compiler error message

from trial and error, I understand that when I change the function declaration to int (* function (args) ) [2] {...} it works like a charm, but why??? I don't understand. How C++ actually sees arrays? How these return declarations int (* function () )[n][m] actually works? What happens when I add another * to function declaration int *(* function () )[n][m] ??

My source for finding the solution to this problem was this but I just copied some code and understood almost 0% of it.

如果有人可以向我解释这些功能的工作原理,那就太好了,如果您可以提出一个很好的阅读源来理解C ++中的这些高级概念,那对我来说将是一个世界。