C语言二级考试——自定义数据类型
十、结构体(即“结构”)与共同体(即“联合”)
- 用 typedef说明一个新类型。
- 结构体和共用体类型数据的定义和成员的引用。
- 通过结构体构成链表,单向链表的建立,结点数据的输出、删除与插入。
知识点参考【C语言】自定义数据类型-CSDN博客
文章目录
- typedef
- 结构体
typedef
第一套13题
本题考查点是用户定义类型(typedef)。
指针数组和数组指针:
//指针数组,是存放指针的数组,即指针类型的数组 int a=0,b=1; int* p1=&a,p2=&b; int* arr1[]={p1,p2},arr2[]={&a,&b}; //数组指针 int arr[]={1,2,3,4,5}; int* p=arr;//arr被转换成了一个指针,可以直接赋值给指针变量
C语言允许用typedef说明一种新类型名,说明新类型名的语句一般形式为:typedef类型名 标识符;由题目可知T是指针类型,T a[10]是指针数组,
int *a[10]
是指针数组;int (*a)[10]
是数组指针;int *a
是指针变量;int a[10]
是数组。本题答案为C
结构体
第一套11题
本题考查结构体的运用。
本题在结构体内定义了指针变量name,字符变量gender,整型变量score,在主函数中定义了两个结构体变量a和b,并为a赋予了新值(初始化);语句b=a是将结构体变量a的内容赋给了结构体变量b。
strcpy(arr1,arr2)
函数是拷贝arr2到arr1。
void *malloc(size_t size)
函数:分配所需的内存空间,并返回一个指向它的指针。对于结构体的赋值,意味着将其中的每一个元素都进行赋值,需要访问结构体变量元素,形式
结构体变量name.成员name
,一级一级的找到最低一级成员再进行对其操作。但该题中b.gender=‘f’;b.score=350;语句又为b赋予了新值,a.name和b.name是指向同一内存地址的,因此a.name=b.name=Zhao。故本题答案为D
第一套12题
注意:本题和上一题的区别是,在主函数前定义了void类型的函数f,调用f函数,在f函数体中给p开辟了一个新的空间,在新的空间里的*p=Qian,但对主函数无任何影响。语句中又为b中的gender和score元素赋予了新值,b.gender=‘f’;b.score=350;.故本题答案为B
关于该题程序的思考:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct stu{
char *name,gender;//成员name赋值内容为字符串形式,同时下面的函数malloc申请内存空间,定义为char*类型
int score;
}STU;
void f(char* p){
p=(char*)malloc(10);//如果该函数不申请新的内存空间,主函数中的b.name调用该函数时,会改变值
strcpy(p,"Qian");
}
main(){
STU a={NULL,'m',290},b;
a.name=(char*)malloc(10);//name指向空,需要申请内存地址
strcpy(a.name,"Zhao");//将Zhao拷贝到a.name指向的地址
// a.gender=(char*)malloc(10);给gender申请内存后,注意printf的形式应为%s
// strcpy(a.gender,"M");
b=a;
f(b.name);
//b.name='test';注意不能给指针直接赋值,下面同理
// b.name=(char*)malloc(10);//给b.name申请新的空间,输出指向的是新的空间,即给b.name再一次进行了赋值
//strcpy(b.name,"Qian");//指针指向的还是a.name的地址,不会输出该拷贝的值
b.gender='f';//如果上面没有申请gender地址,可以直接赋值,score同理
//strcpy(a.name,"A");
//a.name="A";
//b.name="Qian";
//b.gender='F';
b.score=350;
printf("%s,%c,%d",a.name,a.gender,a.score);
printf("%s,%c,%d",b.name,b.gender,b.score);
}
第一套17题
本题考查点是结构体的运用。
本题定义了两个结构体变量a和b,f(a,b)函数是按值传送(传值调用),因此在f函数中将a的内容复制给b,输出Zhao,m,290,但并未对主函数中结构体b中的值造成影响,因i主函数中输出Qian,f,350.故本题答案为A。
- 函数参数:一默认情况下,C使用传值调用来传递参数。一般来说。这意味着函数内的代码不能改变用于调用函数的实际参数。题中代码表明,虽然在函数内改变了a和b的值,但是实际上a和b的值没有发生变化。
第一套18题
该题中的f函数是引用传值。上面的实例表明了,与传值调用不同,引用调用在函数内改变了a与b的值,实际上也改变了函数外a与b的值。故答案为A
- 传值调用,该方法把参数的地址复制给形式参数。在函数内,该地址用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。
第一套20题
本题考查的是结构体数组。
- 结构体数组,是指数组中的每一个元素都是一个结构体类型。
- 访问数组中的特定元素时,第一个索引值为0
假设i,j为整型;stud[i].name[j]对应的是变量stud[10]的第i+1个元素,name[10]中的第j个元素。故本题答案为D。
第一套24题
本题的考查点是对结构体变量成员的引用和结构体指针。
- 若已定义了一个结构体变量和基类型为同一结构体类型的指针变量,并使该指针指向同类型的变量则可以用以下三种形式来引用结构体变量中的成员,结构体变量名也可以是已定义的结构体数组的数组元素。(1)结构体变量名.成员名(2)指针变量名->成员名(3)(*指针变量名).成员名。故本题答案为B。
第一套27题
解析如上题,本题答案为A。
第一套28题
本题考查的是结构体指针和数组指针访问
- 数组指针
int* p=arr=&arr[0]
代表的都是数组的首地址。- 指针访问:在定义数组指针
int* p=arr
后,a[2]等价于*(p+2)
由题目可知room指针指向的是结构体room[4]的第一个元素{“Zhao",19};{room+2}->name指针指向的是结构体room[4]的第三个元素中的Wang。故本题答案为C。