判断题
1-1 结构是变量的集合,可以按照对同类型变量的操作方法单独使用其成员变量。T
1-2 在定义结构类型时,关键字struct
和它后面的结构名共同组成一个新的数据类型名。T
1-3 在定义嵌套的结构类型时,必须先定义成员的结构类型,再定义主结构类型。
1-4 结构数组是结构与数组的结合体,与普通数组的不同之处在于每个数组元素都是一个结构类型的数据,包括多个成员项。T
1-5 结构指针就是指向结构类型变量的指针。T
1-6 假设结构指针p
已定义并正确赋值,其指向的结构变量有一个成员是int
型的num
,则语句 *p.num = 100;
是正确的。F “ . ”的优先级大于“ * ”,所以应该是p->num=100;
1-7 使用结构指针作为函数参数只要传递一个地址值,因此,能够提高参数传递的效率。T
单选题
2-1 对于以下定义,不正确的叙述是( )。
struct ex {
int x;
float y;
char z ;
} example;
A.struct
是定义结构类型的关键字
B.example
是结构类型名
C.x
, y
, z
都是结构成员名
D.struct ex
是结构类型名
选择B
2-2 根据下面的定义,能打印出字母M
的语句是()。
struct person{
char name[10];
int age;
} c[10] = { "John", 17, "Paul", 19, "Mary", 18, "Adam", 16 };
A.printf("%c", c[3].name);
B.printf("%c", c[3].name[1]);
C.printf("%c", c[2].name[0]);
D.printf("%c", c[2].name[1]);
选择C
2-3 设有如下定义,则错误的输入语句是( )。
struct ss{
char name[10];
int age;
char sex;
} std[3], *p = std;
A.scanf("%d", &(*p).age);
B.scanf("%d", p->&age);
C.scanf("%c", &std[0].sex);
D.scanf("%c", &(p->sex));
选择B,应该是&(p->age)
2-4 下列程序的输出结果是( )。
struct stu{
char num[10];
float score[3];
};
int main( )
{
struct stu s[3] = {{ "20021",90,95,85},{"20022",95,80,75},{"20023",100,95,90}};
struct stu *p = s;
int i;
float sum = 0;
for(i=0; i<3; i++){
sum = sum + p->score[i];
}
printf("%6.2f", sum);
return 0;
}
A.260.00 B.270.00 C.280.00 D.285.00
选择B
2-5
以下定义结构变量的语句中,错误的是()。
A.
struct student{
int num;
char name[20];
} s;
B.
struct {
int num;
char name[20];
} s;
C.
struct student{
int num;
char name[20];
};
student s;
D.
struct student{
int num;
char name[20];
};
struct student s;
选择C,应该是struct student s;
2-6 如果结构变量s中的生日是“1984年11月11日”,下列对其生日的正确赋值是()。
struct student
{
int no;
char name[20];
char sex;
struct{
int year;
int month;
int day;
}birth;
};
struct student s;
A.year = 1984; month = 11; day = 11;
B.birth.year = 1984; birth.month = 11; birth.day = 11;
C.s.year = 1984; s.month = 11; s.day = 11;
D.s.birth.year = 1984; s.birth.month = 11; s.birth.day=11;
选择D
2-7 以下程序段的输出结果为()。
struct {
int x, y;
} s[2] = { {1, 3}, {2, 7} };
printf("%d\n", s[0].y/s[1].x );
A.0 B.1 C.2 D.3
选择B,s[0].y为3,s[1].x为2,两者相除为1
2-8 设有如下定义,则对data
中的a
成员的正确引用是()。
struct sk{
int a;
double b;
} data, *p = &data;
A.(*p).data.a B.(*p).a C.p->data.a D.p.data.a
选择B
2-9 对于以下结构定义,++p->str
中的++
加在()。
struct {
int len;
char *str;
} *p;
A.指针str
上 B.指针p
上 C.str
指向的内容上 D.语法错误
选择A
2-10 若有下列定义,则以下不合法的表达式是( )。
struct student{
int num;
int age;
};
struct student stu[3] = {{101, 20}, {102, 19}, {103, 20}}, *p = stu;
A.(p++)->num B.p++ C.(*p).num D.p = &stu.age
选择D
2-11 C语言中结构类型变量在程序执行期间( )。
A.所有成员一直驻留在内存中
B.只有一个成员驻留在内存中
C.部分成员驻留在内存中
D.没有成员驻留在内存中
选择A
2-12 以下程序的输出结果是( )。
struct stu{
int x;
int *y;
} *p;
int dt[4] = {10, 20, 30, 40};
struct stu a[4] = {50, &dt[0], 60, &dt[1], 70, &dt[2], 80, &dt[3]};
int main( )
{
p=a;
printf("%d,", ++p->x);
printf("%d,", (++p)->x);
printf("%d", ++(*p->y));
return 0;
}
A.10,20,20 B.50,60,21 C.51,60,21 D.60,70,3
2-13 对于以下结构定义,(*p)->str++
中的++
加在()。
struct {
int len;
char *str
} *p;
A.指针str
上 B.指针p
上 C.str
指向的内容上 D.语法错误
选择A,虽然char *str后面没有*,但是
2-14 有如下定义:
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);
选择D,字符串不需要取地址
填空题
4-1 写出下面程序段的运行结果 2,3
struct example{
struct {
int x;
int y;
} in;
int a;
int b;
} e;
e.a = 1;
e.b = 2;
e.in.x = e.a * e.b;
e.in.y = e.a + e.b;
printf("%d,%d\n", e.in.x, e.in.y); /* 输出数据之间没有空格分隔 */
4-2 写出下面程序段的运行结果 23,wang,98.5,wang
struct example {
int a;
double b;
char *c;
}x = {23, 98.5, "wang"}, *px = &x;
printf("%d,%s,%.1f,%s\n", x.a, x.c, (*px).b, px->c); /* 输出数据之间没有空格分隔 */
4-3 写出下面程序段的运行结果 10,41,70(服了,千万别忘记写逗号了)
struct table {
int x, y;
}a[4]={{10, 20}, {30, 40}, {50, 60}, {70, 80}};
struct table *p = a;
printf("%d,", p++->x); /* 以下输出数据之间没有空格分隔 */
printf("%d,", ++p->y);
printf("%d", (a+3)->x);
4-4 运行以下程序段,第1行输出 2,第2行输出 7,3
struct {
int a; int *b;
} s[4], *p;
int i, n = 1;
for(i = 0; i < 4; i++){
s[i].a = n;
s[i].b = &s[i].a;
n = n + 2;
}
p = &s[0];
printf("%d\n", ++*p->b);
p++;
printf("%d,%d\n", (++p)->a, (p++)->a); /* 输出数据之间没有空格分隔;按从右向左的顺序求解表达式 */
4-5 写出下面程序的运行结果 1,2,A,B
struct s1{
char c1, c2;
int n;
};
struct s2{
int n;
struct s1 m;
} m = {1, {‘A’, 'B’, 2} };
int main(void)
{
printf("%d,%d,%c,%c\n", m.n, m.m.n, m.m.c1, m.m.c2); /* 输出数据之间没有空格分隔 */
return 0;
}
4-6 以下程序的运行结果是 2,32
#include<stdio.h>
struct ps{
double i;
char arr[24];
};
int main()
{
struct ps s[3], *p1, *p2;
p1=s;
p2=s+2;
printf("%d,%d\n", p2-p1, sizeof(struct ps)); /* 输出数据之间没有空格分隔 */
return 0;
}
4-7 以下程序的运行结果是 123213321
#include <stdio.h>
struct st{
char c;
char s[80];
};
struct st a[4] = {{'1',"123"}, {'2',"321"}, {'3',"123"}, {'4',"321"}};
char * f(struct st *t);
int main( )
{ int k;
for(k = 0; k < 4; k++){
printf("%s", f(a+k));
}
return 0;
}
char * f(struct st *t)
{
int k = 0;
while(t->s[k] != '\0'){
if( t->s[k] == t->c){
return t->s+k;
}
k++;
}
return t->s;
}