关于这个题目,调用第二个函数出错

图片说明
图片说明

刚开始学习指针,跪求解决方案和原因!

#include<stdio.h>

void main()
{
    int *chazhao(int);
    void bujige(int);
    int a[5][3] = { {59,60,60},{61,60,61},{67,87,99} ,{66,77,88},{49,32,65} };
    int n, i, j;
    printf("输入学生学号:\n");
    scanf_s("%d", &n);
    printf("该学生成绩是:");
    for (i = 0; i <= 2; i++)
    {
        printf("%d ", *(chazhao(n, a) + i));
    }
    printf("\n");
    printf("不及格的学生有:\n");
    bujige(a);
    system("pause");
}
int *chazhao(int q, int *p[3])
{
    int *m;
    m = p + q;
    return m;
}
void bujige(int *k[3])
{
    int x, y;
    for (x = 0; x <= 4; x++)
    {
        for (y = 0; y <= 2; y++)
        {
            if (*(*(k + x) + y) < 60)
            {
                printf("%d", x);
            }
        }
    }
}

哇!
犯傻了!
代码不规范,亲人俩行泪!

void bujige(int *k[3])

改成

void bujige(int (*k)[3])

就可以了,但是原理还是不是很懂
求解释

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int *chazhao(int q, int *p);
    void bujige(int *k);
    int a[5][3] = { {59,60,60},{61,60,61},{67,87,99} ,{66,77,88},{49,32,65} };
    int n;
    printf("输入学生学号:\n");
    scanf_s("%d", &n);
    printf("该学生成绩是:");
    for (int i = 0; i <= 2; i++)
    {
        printf("%d ", *(chazhao(n, &a[0][0]) + i));
    }
    printf("\n");
    printf("不及格的学生有:\n");
    bujige(&a[0][0]);
    system("pause");
}
int *chazhao(int q, int *p)
{
    int *m;
    m = p + q;
    return m;
}
void bujige(int *k)
{
    int x, y;
    for (x = 0; x <= 4; x++)
    {
        for (y = 0; y <= 2; y++)
        {
            if (k[x*3+y] < 60)
            {
                printf("%d\n", x);
                break;
            }
        }
    }
}