C语言有关问题,谁帮小弟我看看下面警告有关问题,为什么会这样,多谢

C语言问题,哪位高手帮我看看下面警告问题,为什么会这样,谢谢。
warning C4047: 'function' : 'int ** ' differs in levels of indirection from 'int [3][3]'



int identity_matrix(int **matrix)
{
printf("%d ",matrix[1][1]);
return 1;

}

void main()
{
int matrix[3][3] = {
{1,0,0},
{0,1,0},
{0,0,1}
};

printf("%d\n",identity_matrix(matrix));
}

------解决方案--------------------
将int identity_matrix(int **matrix)里面的 int **matrix 改成 int (*mattrix)[3]就好了。
就是函数的形式应该是这样的 int identity_matrix(int (*matrix)[3])。

------解决方案--------------------
定义的是双重指针,传进去的是数组指针,前者指向指针,后者指向数组
------解决方案--------------------
想知道为什么,求牛人解释!
------解决方案--------------------
二维数组实际上以一维数组的方式存放的,一维数组存放一组指针,然后分别指向另一个一维数组
一个2*3的指针就必须要知道一维的大小才能寻址,直接传递到二维指针就丢失了这个信息