新手C语言,写了一个指针的小程序。请帮我看一下哪里错了?
#include<stdio.h>voidmain(){doublea[][5]={{86,85.5,73.5,61,79},{62.5,74,70.5,92,86},{...
#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,开始并未赋值而是最后赋的。“因为它仍旧不是一个野指针”
可以这样理解吧? 展开
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,开始并未赋值而是最后赋的。“因为它仍旧不是一个野指针”
可以这样理解吧? 展开
1个回答
展开全部
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的地址,也行得通,这样就不是野指针了吧?(因字数限制,我写在评论里,请您看一下)
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询