一、视频学习
1.观看视频:3.2.1结构类型、3.2.2结构与函数、3.2.3 结构中的结构
2.C语言代码
①视频代码列表
②书本9.1输出平均分最高的学生信息代码
③书本9.2学生成绩排序代码
④书本9.3修改学生成绩代码
3.手写笔记
4.遇到的问题
①问题:%i的含义
结果:在 printf 格式串中使用时,没有区别。在 scanf 格式串中使用时%d 只与十进制形式的整数相匹配。而%i 则可以匹配八进制、十进制、十六进制表示的整数。例如: 如果输入的数字有前缀 0(018、025),%i将会把它当作八进制数来处理,如果有前缀0x (0x54),它将以十六进制来处理。
②问题:视频中结构中的结构数组代码,不清楚结构体变量和结构体数组直接的关系
#include<stdio.h>
struct point {
int x;
int y;
};
struct rectangle {
struct point p1;
struct point p2;
};
void printrect(struct rectangle r) {
printf("<%d,%d>to<%d,%d>
",r.p1.x,r.p1.y,r.p2.x,r.p2.y);
}
int main(int argc,char const *argv[]) {
int i;
struct rectangle rects[]= {{{1,2},{3,4}},{{5,6},{7,8}}};
for(i=0;i<2;i++)printrect(rects[i]);
}
结果:编译运行后发现{1,2}为rects[0](结构数组)中p1(结构)的x、y成员,{3,4}为rects[0](结构数组)中p2(结构)的x、y成员,同理{5,6},{7,8}分别是rects[1](结构数组)中p1(结构)的x、y成员和rects[1](结构数组)中p2(结构)的x、y成员。故结构体变量可以作为结构体数组的元素。
二、PTA中遇到的问题
1、问题:PTA2-1对于以下结构定义:struct { int len; char *str;}*p;++p->str中的++加在________
A指针str上 B. 指针p上 C. str所指的内容上 D.以上均不是
结果:->的优先级比++ 所以++p->str结果就是 (p->str)=(p->str)+1
可能答案:A
2、问题:PTA2-3有如下定义
struct student{
char name[10];
int age;
char gender;
}std[3], *p=std;
则以下各输入语句中错误的是:
A.scanf("%d" ,&(*p) .age );
B.scanf("%c" ,&std[0] .gender);
C.scanf("%c" ,&(p->gender));
D.scanf("%s" ,&std.name);
结果:选项A中“&(*p).age”代表的是std[0]age的地址,是正确的,选项B也是正确的,选项C先用指针变量引用结构型的成员name,然后取它的地址,也是正确的,选项D中的“std.name"是错误的引用,因为std是数组名,代表的是数组的首地址,地址没有成员“name”。
可能答案:D
3、特别注意点:结构数组不同于一般数组,相同类型的结构数组间可以相互赋值。