判断题:
1.结构是变量的集合,可以按照对同类型变量的操作方法单独使用其成员变量。T
2.在定义结构类型时,关键字struct和它后面的结构名共同组成一个新的数据类型名。T
3.在定义嵌套的结构类型时,必须先定义成员的结构类型,再定义主结构类型。
T,但是为什么?
4.不同类型的结构变量之间也可以直接赋值。

经过试验后,发现不能,但不同类型里的不同成员只要类型相同,可以相互赋值。
5.在对结构变量操作时,.被称为成员或者分量运算符。T
6.结构数组是结构与数组的结合体,与普通数组的不同之处在于每个数组元素都是一个结构类型的数据,包括多个成员项。T
7.对于结构数组s,既可以引用数组的元素s[i],也可以引用s[i]中的结构成员。
(1)整个s[i]的引用如定义一个指针变量指向它,解引用就等同于s[i];
(2)用指针变量指向成员,或用结构体名.成员都可以对结构成员进行访问
单选题

经过编译器编译后,可以运行,是很正确的说明定义
struct后是结构类型名,example是新创建的一个该形变量

结构体内字符数组无需“&”符号,因为其本身就是地址,所以这题选A

第一次见给*p赋值的情况
首先梦回数组:
int arr[2] = {0,1}; int* p = arr;
那么*p = 0, *(p+1) = 1;它等同于,arr[0]和arr[1];
那如果,int* p; *p = arr;
(1)首先我依然按照上面相同的输出


结果它报错,大致意思为将一个地址(或指针变量)强行赋值给int型变量(*p),得进行强转
所以类比无效;
回到题干,发现是题目看错,这本来就无法赋值
它是定义了一个结构体:struct student *p,然后又把结构体数组的首地址stu赋给了这个指针变量
所以D不合法的原因是将成员变量的地址赋给了结构体变量指针?尝试编译

也就是我定义的如果是结构体数组,不使用指针是无法直接使用结构体名访问成员的
类比到数组,我可以用指针移位来访问整个数组的个数,而赋值指针只需要数组首地址,而如果我需要用数组名访问数组的话,需要加上坐标。

此题是对运算顺序的考察:
在表达式中,优先级较高的先于优先级较低的进行运算。
而在一个运算量两侧的运算符优先级相同时,则按运算符的结合性所规定的结合方向处理。
结合性:C语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结合性(自右至左)。
目前需要查表。
此题中:
箭头和括号的优先级相同且最高,他们是左结合,从左到右
++和 * 相同且其次, 但它们是右结合,从右到左,以此为基础,开始读程序
(1)结构体数组变量名赋给指针变量p
(2)第一个printf语句,先执行箭头访问结构体数组第一个结构体的成员 x ,然后对该成员进行++
得到51,有点类似于复合函数的求导。
此处复习一下++运算符作为前后缀,单独成句时没有区别,都是自己给自己+1
但++p = 1指的是先将p赋值1后再++,得到p ==2;.
而p++= 1指的是先将p++后再赋值1;此时p==1;
(3)所以执行第一个printf语句后,p的值并未发生变化
(4)第二个printf语句括号和箭头同时出现,从左到右,p+1指向结构体数组内第二个结构体变量 时,再指向它的成员 x ,得到60
(5)p指向了第二个结构体变量
(6)第三个printf语句,括号内先运算,箭头优先,访问到第二个结构体变量的指针变量y并进行解引用,得到定义数组中的第二个元素20,再进行++,得到21;
答案选C

有了上一题的基础,首先运行括号内对p进行解引用然后执行箭头访问成员最后进行++
然后就选了C选项
但答案选D,原因是:箭头左边应该是指针变量p,解引用了后是结构体名应该用 . 访问
所以应该是:
(*p).str++,或者说是p->str++
填空题

同样考察运算符
(1)第一个printf 访问成员b解引用后进行++,p的值未发生变化
(2)p指向第二个结构体变量
(3)出现长串逗号,运算从右到左(你想如果从左到右它怎么输出?所以一定是从右到左,事实 上逗号运算符就是右结合。)
(4)右1运算,p先指向第三个结构体变量,然后访问该变量成员a,得到3
(5)右2运算,也是p先指向第四个结构体变量,然后访问成员a,得到7
所以答案如上

这个题目的意思就是,在s[80]字符串里里找字符c,找到了就输出字符串里的c开始后面所有的字符直到\0出现,如第一个循环,找到1后,发现1就是第一个字符串的第一个元素,所以返回s+k时,再输出就是123,又如第四个循环,找不到,那就返回原字符串
所以答案是:
123 23 3 321
总结:当函数返回s(字符串名)+k时,就是返回第(k+1)个字符后的全新字符串(因为末尾有 \0)