若有下列定义,则以下不合法的表达式是( )。 struct student{ int num; int age; }; struct student stu[3] = {{101, 20}, {102, 19}, {103, 20}}, *p = stu;
时间: 2023-05-31 22:19:37 浏览: 851
struct和typedef struct区别
### 回答1:
这段代码定义了一个结构体类型为student,包含两个成员变量:num和age。接着用这个结构体类型定义了一个stu数组,包含三个元素,分别初始化为{101, 20},{102, 19}和{103, 20}。最后定义了一个指向结构体类型为student的指针p,初始化为stu数组的首地址。
### 回答2:
在这个定义中,定义了一个名为student的结构体,其中包含了学生的编号num和年龄age。同时,定义了一个名为stu的结构体数组,包含了三个学生的信息,分别是编号101、年龄20,编号102、年龄19,编号103、年龄20。另外,还定义了一个名为p的指针,指向数组stu的第一个元素。因此,这个定义是合法的。
对于题目中给出的表达式,我们需要分析它的语法和语义,判断是否合法。
1. {101, 20, 102, 19, 103, 20}
这个表达式是将所有的学生信息直接放在了一个大括号中,没有按照结构体成员的方式进行排列。因此,这个表达式不符合定义中的结构体形式,是不合法的。
2. &stu[2]
这个表达式是取数组stu的第三个元素的地址,返回的是一个指向结构体类型的指针。虽然没有显式地提到学生的编号和年龄,但是在定义中已经规定了结构体的成员,因此这个表达式是合法的。
3. stu.age
这个表达式中使用了一个点运算符,在结构体类型中表示访问成员变量。但是,在这个表达式中缺少了结构体的成员名,无法访问指定的成员变量,因此这个表达式是不合法的。
4. *(p+1)->num
这个表达式从左到右的意思是:p+1表示指向数组stu的第二个元素的指针,*表示取出指针指向的结构体,这里就是第二个学生的结构体。->表示访问结构体的成员变量num,即第二个学生的编号。因此,这个表达式是合法的。
综上所述,不合法的表达式是{101, 20, 102, 19, 103, 20}和stu.age。
### 回答3:
在这个结构体定义和变量初始化的语句中,定义了一个名为student的结构体,该结构体包含两个整型变量:num和age。此外,还定义了一个名为stu的结构体数组,包含三个元素,每个元素都是一个student类型的结构体,并且给每个元素的num和age成员变量赋初值。还定义了一个名为p的指向student类型结构体的指针变量,并将stu数组的首地址赋给了它。
下列不合法的表达式是103.age,因为结构体中的成员变量不能直接访问,需要通过结构体变量或指向结构体的指针来访问,正确的表达式应该是(p+2)->age,意为访问stu数组中第三个元素的age成员变量。
阅读全文