C语言指针小问题求大神

#include"stdio.h" //求N名同学最高分然后输出该同学的分数和学号
#define N 10
void finemax(int *p,int *q,int k)
{
int i,*m,*n;
*m=*p;
*n=*q;
for
(i=0;i小于k;i++)
{
if(*p>*m)
{*m=*p;*n=*q;}
p++;
q++;
}
printf("最高分是:%d,学号为:%d\n",*m,*n);
}
int main()
{
int i,k,a[N],b[N]; //数组a存学生成绩,b存学号。
printf("请输入要计算同学数量:");
scanf("%d",&k);
printf("请分别输入同学的成绩和学号:\n");
for(i=0;i<k;i++)
{
scanf("%d",&a[i]);

scanf("%d",&b[i]);
}
finemax(a,b,k);
return 0;
}
图片说明
帮忙分析一下原因

问题出在 int i,*m,*n;。你这样声明 m,和n,他俩是指针类型,并没有分配内存空间。然后你就进行*m=*q,这句话的意思是把q指向的内存的值赋值给m指向的内存,但是此时m并没有分配内存,这样就产生了错误。
你应该这样声明m,n。 int m,n。不要声明称指针类型。不知道这样说你明不明白

fineman函数的for循环。。你贴出来的代码有问题吧,你在看一下。
给出我写的fineman函数

 void finemax(int *p,int *q,int k)
{
 int i,m,n;
 m=*p;
 n=*q;
 for(i=1;i<k;i++)
 {
     p++;
     q++;
     if(*p>m)
     {
             m=*p;
             n=*q;
     }
 } 
 printf("最高分是:%d,学号为:%d\n",m,n);
}

用一个指针初始化另一个指针时,语句为

 int a=99;
 int *p=&a;
 int *m=p;

如果一个指针赋值给另一个指针时,语句为

 int a=10;
 int *p=&a;
 int *m;
 m=p;

请注意:p 或者 m都是一个int型的指针,*p 或者 *m 都是一个int型的变量。
按照你语句中的写法,是将一个指针指向的变量 赋值 给另外一个指针指向的变量。
首先,如果你确定想这么做的话,你就没必要再定义m和n两个指针,直接定义int型变量m和n就可以了。
其次,你定义的m和n两个指针变量现在没有指向一块指定的内存空间,或者可以说,m和n所指向的空间是随机的,也有可能指向你系统的内核。
然后,你就要往指向的这块空间里赋值。所以会报错。

下面,附上修改后代码,以及注释,请参考。

#include"stdio.h" //求N名同学最高分然后输出该同学的分数和学号
#define N 10
#pragma warning(disable:4996)
void finemax(int *p, int *q, int k)
{
    int i, *m, *n;
    m = p;//在这里进行赋值,不需要加星号
    n = q;//
    for(i = 0; i<k; i++)
    {
        if (*p > *m)
        {
            m = p; n = q; // 在这里进行赋值,不需要加星号
        }
        p++;
        q++;
    }
    printf("最高分是:%d,学号为:%d\n", *m, *n);
}
int main()
{
    int i, k, a[N], b[N]; //数组a存学生成绩,b存学号。
    printf("请输入要计算同学数量,不得超过10个.");
    scanf("%d", &k);
    printf("请分别输入同学的成绩和学号:\n");
    for (i = 0; i < k; i++)
    {
        scanf("%d", &a[i]);
        scanf("%d", &b[i]);
        //这两句话可以合并成一句 scanf("%d %d", &a[i], &b[i]);
    }
    finemax(a, b, k);
    return 0;
}