#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 *locate = &a[0][1]有疑问,为何非要赋值,那赋个&a[0][0]岂不更好,或者不赋也是一样的吧?
后面我是这样改的,直接把指针函数运行后返回的地址,赋给double *locate的地址,也行得通,这样就不是野指针了吧?(因字数限制,我写在评论里,请您看一下)
首先声明:从你问题里面提交的程序为基础
提出的疑问,给这个指针初始化一个合法值,&a[0][0]或者&a[0][1]或者你函数的返回值都可以;但是,在定义之外你再给一个没有初始化的指针进行处理,是错误的
我的经验,你可以尝试将指针的值输出,看一下它在内存中的相对位置,给你截取一张我的测试图片,如下:
明白了,我以后会注意指针初始化,谢谢!