结构体问题探究_12_18.c

判断题:

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)


版权声明:本文为nonemeek原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。