新手C语言,写了一个指针的小程序。请帮我看一下哪里错了?

#include <stdio.h>

void main()
{
double a[][5]={{86, 85.5, 73.5, 61, 79},{62.5, 74, 70.5, 92, 86}, {73.5, 66, 85.5, 96, 61}, {65, 72.5, 68, 98.5, 81}};
double *locate_student(double (*student)[5], int n);
double print_score(double *p);
int m;
double *locate;
printf("please input the number of student:\n");
scanf("%d", &m);
printf("the score of student %d is:\n", m);
*locate=*locate_student(a, m);
print_score(locate);
}

double print_score(double *p)
{
int i;
for (i=0; i<5; i++)
{
printf("score of subject %d is %lf", i, *(p+i));
}
return (*p);
}

double *locate_student(double (*student)[5], int n)
{
double *p;
p=*(student+n);
return (p);
}

想实现的功能:有一个数组a,储存四个学生(共五个科目)的成绩。当我输入学生序号(0-3),会打印该学生的成绩。
我在使用指针时,把自己绕进去了,想不出哪错了。希望有人帮我理清思路,谢谢!
double *locate;//未赋值
printf("please input the number of student:");
scanf("%d", &m);
locate=locate_student(a, m);//返回的地址赋值给locate
print_grade(locate);
--------------------------以上为main函数部分-----------------------------------
double *locate_student(double (*student)[5], int i)
{
double *p;
p=*(student+i);//二维指针指向一维指针的地址
return (p); //最终返回一个double类型的指针
}
--------------------------------------结束--------------------------------------------
如您所见,主函数的double *locate,开始并未赋值而是最后赋的。“因为它仍旧不是一个野指针”
可以这样理解吧?

double a[][5] = { { 86, 85.5, 73.5, 61, 79 },{ 62.5, 74, 70.5, 92, 86 },{ 73.5, 66, 85.5, 96, 61 },{ 65, 72.5, 68, 98.5, 81 } };
double *locate_student(double(*student)[5], int n);
double print_score(double *p);
int m;
double *locate = &a[0][1];
//问题出现在这里,没有对声明的指针进行初始化
//你这样定义,会造成指针变成野指针
//解决方法,将指针置为NULL或者给指针一个合法的地址
//因为在下面需要给指针指向的地址赋值,所以不能给指针置为NULL,
//这里解释一下,因为NULL指向的区域为空闲区域,不允许赋值
//所以这里应该改成,给指针一个合法的地址,就是定义一个double变量,将地址赋给这个指针
printf("please input the number of student:\n");
scanf_s("%d", &m);
printf("the score of student %d is:\n", m);
*locate = *(locate_student(a, m));

追答

或者像第一位芝麻酱的回答那样,直接将函数返回的地址赋值给指针也可以

追问

你说的对,之前是我太糊涂了,没有搞清楚指针的含义。
关于double *locate = &a[0][1]有疑问,为何非要赋值,那赋个&a[0][0]岂不更好,或者不赋也是一样的吧?
后面我是这样改的,直接把指针函数运行后返回的地址,赋给double *locate的地址,也行得通,这样就不是野指针了吧?(因字数限制,我写在评论里,请您看一下)

追答

首先声明:从你问题里面提交的程序为基础

提出的疑问,给这个指针初始化一个合法值,&a[0][0]或者&a[0][1]或者你函数的返回值都可以;但是,在定义之外你再给一个没有初始化的指针进行处理,是错误的

我的经验,你可以尝试将指针的值输出,看一下它在内存中的相对位置,给你截取一张我的测试图片,如下:

追问

明白了,我以后会注意指针初始化,谢谢!

温馨提示:答案为网友推荐,仅供参考
相似回答