一道简单题--解释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。
- 一道简单题--解释C语言的指针,结构体等基本用法
- C语言中->、变量、指针、结构体的解释,通俗易懂!
- C语言结构体指针,函数指针的用法
- 一道C语言的指针笔试题
- C语言的灵魂--指针基本用法
- c语言结构体中保存函数指针的用法
- 简单的C例子解释C的基本结构....
- 一道简单的C语言题
- 一道简单的C语言题
- C语言 结构体与结构体指针用法总结
- C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表
- C/C++ 结构体 字节对齐原则详细举例解释 及sizeof的基本用法
- C语言结构体定义函数指针的简单高效的使用例子
- 一道简单的C语言嵌套
- 一道简单C语言题目的优化
- C typedef的用法 结构体指针的用法
- C语言指针学习笔记:指向结构体的指针
- c语言结构体指针
- 接口测试
- git remote
- Springmvc +JNDI 在Tomcat下 配置数据源
- RasberryPi快速启动(适合首次接触树莓派学习者)
- 基于kahka的activeMq高可用集群部署详解
- 一道简单题--解释C语言的指针,结构体等基本用法
- 市场研究中的数据分析知识整理 (六)-数据模拟
- MySQL基础总结
- 国内各种坐标系以及对应的转化方法
- Linux---VMware 虚拟机安装 CentOS 7.3、配置JDK环境、Tomcat服务器、MySQL数据库
- HTTP详解(十四):非对称加密算法正传
- $.each jquery遍历 demo
- A
- Intellij IDEA Scala开发环境搭建