一道简单题--解释C语言的指针,结构体等基本用法

来源:互联网 发布:网络现金赌博信誉平台 编辑:程序博客网 时间:2024/06/07 09:17

之前一直用的是java,然后最近想走Android底层,需要学习C语言,大一学的C语言本来学的就不好,又一直没去用,都忘记C语言的重点指针,最近重拾谭浩强的C语言,然后通过一道题给指针等基本语句做个笔记,有C语言的大牛可以指点下有没有理解错,谢谢。。


题目:有n个结构体变量,内含学生学号,姓名和3门课程。要求输出平均成绩最高的学生的信息(包括学号、姓名、3门课程成绩和平均成绩)。

#include <stdio.h>#define N 3 //宏定义struct Student{int num;char name[20];float score[3]float aver;};int main(){//函数的声明void input(struct Student stu[]);struct Student max(struct Student []);void print(struct Student );void printPointAll(struct Student []);void printPointer(struct Student *);struct Student stu[N];struct Student *p;p=stu;struct Student *ps;ps=&stu[0];input(p);printf("**************************\n");printPointer(ps);printf("**************************\n");print(max(p));printf("**************************\n");printPointAll(stu);return 0;}void input(struct Student stu[]){printf("请输入学生信息\n");for(int i=0;i<N;i++){scanf("%d%s%f%f%f",&stu[i].num,stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);stu[i].aver=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3.0;}}struct Student max(struct Student stu[]){int m=0;for(int i=0;i<N;i++){if(stu[i].aver>stu[m].aver){m=i;}}return stu[m];}void printPointer(struct Student * ps){printf("指针--打印第一个学生信息\n");printf("学号:%d,姓名:%s,平均成绩:%f\n",ps->num,ps->name,ps->aver);}void printPointAll(struct Student stu[]){printf("打印所有学生信息\n");struct Student * ps;for(ps=stu;ps<stu+N;ps++){printf("学号:%d\n姓名:%s\n三门课:%5.1f,%5.1f,%5.1f\n平均成绩:%6.2f\n",ps->num,ps->name,ps->score[0],ps->score[1],ps->score[2],ps->aver);}}void print(struct Student stu){printf("最高成绩的学生信息:\n");printf("学号:%d\n姓名:%s\n三门课:%5.1f,%5.1f,%5.1f\n平均成绩:%6.2f\n",stu.num,stu.name,stu.score[0],stu.score[1],stu.score[2],stu.aver);}

先看下上面代码运行结果:


结构体就像java的类一样,然后C语言在使用函数时需要对函数进行声明。

首先要理解指针要熟练掌握两个有关的运算符

1.&  取地址运算符  &a 是变量a的地址

2. *  指针运算符   *p代表的是指针变量p指向的对象

注意 p是指针变量,指针变量名,*p才是指向的对象,int是指向对象的基类型。

先看个简单的用法

int a = 100;

int *point;

point =&a;

意思是把a的地址赋值给point;

也可以这样写

int a= 100;

int *point = &a;

然后可能有人就不理解这段

struct Student stu[N];
struct Student *p;
p=stu;

为什么不是p=&stu,这是因为stu是个数组,在C语言中,数组名(不包括形参数组名,形参数组并不占据实际的内存单元)代表数组中首元素(即序号的为0的元素)的地址。所以,下面两个语句等价

p=stu;和

p=&stu[0];

stu[i]等价于*(stu+i)或者*(p+i),

所以

scanf("%d%s%f%f%f",&stu[i].num,stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);

scanf本来后面放的应该是地址,但是stu[i].name因为是个char的数组,本身指向首地址。所以不要取地址符。


理解了上面,再理解下这段

void printPointAll(struct Student stu[]){printf("打印所有学生信息\n");struct Student * ps;for(ps=stu;ps<stu+N;ps++){printf("学号:%d\n姓名:%s\n三门课:%5.1f,%5.1f,%5.1f\n平均成绩:%6.2f\n",ps->num,ps->name,ps->score[0],ps->score[1],ps->score[2],ps->aver);}}
ps是指向struct Student结构体类型数组的指针变量。在for语句中先使p的初值在stu,也就是数组stu第一个元素的起始地址。在第一次循环中输出stu[0]的各个成员值。然后执行ps++后ps的值等于stu+1;也就是p指向stu[1]的地址,同理。



注意:*(p++)和*(++p)作用是不相同的,前者是先取*p值,然后使p加1,后者是使p加1,再取*p。

原创粉丝点击