《计算机二级C语言程序设计第10讲.ppt》由会员分享,可在线阅读,更多相关《计算机二级C语言程序设计第10讲.ppt(42页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第10讲讲 结构结构为将不同数据类型、但相互关联的一组数据,组合为将不同数据类型、但相互关联的一组数据,组合成一个有机整体使用,成一个有机整体使用,C语言提供一种称为语言提供一种称为“结构结构”的的数据结构数据结构。10.1 结构类型与结构变量的定义结构类型与结构变量的定义 10.2 结构变量的引用与初始化结构变量的引用与初始化 10.3 结构数组结构数组10.4 指向结构类型数据的指针指向结构类型数据的指针10.5 共用型和枚举型共用型和枚举型10.6 定义已有类型的别名定义已有类型的别名10.1 结构类型与结构变量的定义结构类型与结构变量的定义C语言中的结构类型,相当于其它高级语言中的语
2、言中的结构类型,相当于其它高级语言中的“记录记录”类型。类型。10.1.1 结构类型定义结构类型定义struct 结构类型名结构类型名 /*struct是结构类型关键字是结构类型关键字*/数据类型数据类型 数据项数据项1;数据类型数据类型 数据项数据项2;数据类型数据类型 数据项数据项;/*此行分号不能少!此行分号不能少!*/案例案例10.1 定义一个反映学生基本情况的结构类型,用以存储学生定义一个反映学生基本情况的结构类型,用以存储学生的相关信息。的相关信息。/*案例代码文件名:案例代码文件名:AL10_1.C。*/*功能:定义一个反映学生基本情况的结构类型功能:定义一个反映学生基本情况的结
3、构类型*/struct date /*日期结构类型:由年、月、日三项组成日期结构类型:由年、月、日三项组成*/int year;int month;int day;struct std_info/*学生信息结构类型:由学号、姓名、性别和生日共学生信息结构类型:由学号、姓名、性别和生日共4项组成项组成*/char no7;char name9;char sex3;struct date birthday;struct score/*成绩结构类型:由学号和三门成绩共成绩结构类型:由学号和三门成绩共4项组成项组成*/char no7;int score1;int score2;int score3;
4、(1)“结构类型名结构类型名”和和“数据项数据项”的命名规则,与变量名相同。的命名规则,与变量名相同。(2)数数据据类类型型相相同同的的数数据据项项,既既可可逐逐个个、逐逐行行分分别别定定义义,也也可可合并成一行定义。合并成一行定义。例如,本案例代码中的日期结构类型,也可改为如下形式:例如,本案例代码中的日期结构类型,也可改为如下形式:struct date int year,month,day;(3)结结构构类类型型中中的的数数据据项项,既既可可以以是是基基本本数数据据类类型型,也也允允许许是是另一个已经定义的结构类型。另一个已经定义的结构类型。例例 如如,本本 案案 例例 代代 码码 中中
5、 的的 结结 构构 类类 型型 std_info,其其 数数 据据 项项“birthday”就是一个已经定义的日期结构类型就是一个已经定义的日期结构类型date。(4)本书将个本书将个数据项数据项称为结构类型的个称为结构类型的个成员成员(或(或分量分量)。)。10.1.2 结构变量定义结构变量定义用用户户自自己己定定义义的的结结构构类类型型,与与系系统统定定义义的的标标准准类类型型(int、char等)一样,可用来定义结构变量的类型。等)一样,可用来定义结构变量的类型。1.定义结构变量的方法,可概括为两种:定义结构变量的方法,可概括为两种:(1)间接定义法间接定义法先定义结构类型、再定义结构变
6、量先定义结构类型、再定义结构变量例例如如,利利用用案案例例10.1中中定定义义的的学学生生信信息息结结构构类类型型std_info,定定义了一个相应的结构变量义了一个相应的结构变量student:struct std_info student;结结构构变变量量student:拥拥有有结结构构类类型型的的全全部部成成员员,其其中中birthday成成员是一个日期结构类型,它又由员是一个日期结构类型,它又由3个成员构成。个成员构成。注注意意:使使用用间间接接定定义义法法定定义义结结构构变变量量时时,必必须须同同时时指指定定结结构构类类型名。型名。(2)直接定义法直接定义法在定义结构类型的同时,定义
7、结构变量在定义结构类型的同时,定义结构变量例如,结构变量例如,结构变量student的定义可以改为如下形式:的定义可以改为如下形式:struct std_info student;同时定义结构类型及其结构变量的一般格式如下:同时定义结构类型及其结构变量的一般格式如下:struct 结构类型名结构类型名 结构变量表;结构变量表;2.说明说明(1)结结构构类类型型与与结结构构变变量量是是两两个个不不同同的的概概念念,其其区区别别如如同同int类类型与型与int型变量的区别一样。型变量的区别一样。(2)结结构构类类型型中中的的成成员员名名,可可以以与与程程序序中中的的变变量量同同名名,它它们们代代表
8、不同的对象,互不干扰。表不同的对象,互不干扰。Return10.2 结构变量的引用与初始化结构变量的引用与初始化案例案例10.2 利用利用案例案例10.1中定义的结构类型中定义的结构类型struct std_info,定义定义一个结构变量一个结构变量student,用于存储和显示一个学生的基本情况。用于存储和显示一个学生的基本情况。#include#include struct.h/*定义并初始化一个外部结构变量定义并初始化一个外部结构变量student*/struct std_info student=000102,张三张三,男男,1980,9,20;main()printf(No:%sn,
9、student.no);printf(Name:%sn,student.name);printf(Sex:%sn,student.sex);printf(Birthday:%d-%d-%dn,student.birthday.year,student.birthday.month,student.birthday.day);程序运行结果:程序运行结果:No:000102Name:张三张三Sex:男男Birthday:1980-9-20 1.结构变量的引用规则结构变量的引用规则对对于于结结构构变变量量,要要通通过过成成员员运运算算符符“.”,逐逐个个访访问问其其成成员员,且且访问的格式为:访问的
10、格式为:结构变量结构变量.成员成员 /*其中的其中的“.”是成员运算符是成员运算符*/例例如如,案案例例中中的的student.no,引引用用结结构构变变量量student中中的的no成成员员;student.name引用结构变量引用结构变量student中的中的name成员,等等。成员,等等。如如果果某某成成员员本本身身又又是是一一个个结结构构类类型型,则则只只能能通通过过多多级级的的分分量量运运算算,对最低一级的成员进行引用。对最低一级的成员进行引用。此时的引用格式扩展为:此时的引用格式扩展为:结构变量结构变量.成员成员.子成员子成员.最低最低1级子成员级子成员例如,引用结构变量例如,引用
11、结构变量student中的中的birthday成员的格式分别为:成员的格式分别为:student.birthday.yearstudent.birthday.monthstudent.birthday.day(1)对对最最低低一一级级成成员员,可可像像同同类类型型的的普普通通变变量量一一样样,进进行行相相应应的的各各种运算。种运算。(2)既可引用结构变量成员的地址,也可引用结构变量的地址。既可引用结构变量成员的地址,也可引用结构变量的地址。例如,例如,&student.birthday.year,&student。2.结构变量的初始化结构变量的初始化结构变量初始化的格式,与一维数组相似:结构变
12、量初始化的格式,与一维数组相似:结构类型结构类型 结构变量结构变量=初值表初值表不不同同的的是是:如如果果某某成成员员本本身身又又是是结结构构类类型型,则则该该成成员员的的初初值值为为一一个个初值表。初值表。例如,例如,案例案例10.2中的中的struct std_info student=000102,张三张三,男男,1980,9,20;注注意意:初初值值的的数数据据类类型型,应应与与结结构构变变量量中中相相应应成成员员所所要要求求的的一一致致,否则会出错。否则会出错。Return10.3 结构数组结构数组 结构数组的每一个元素,都是结构类型数据,均包含结构类型结构数组的每一个元素,都是结构
13、类型数据,均包含结构类型的所有成员。的所有成员。案例案例10.3 利用利用案例案例10.1中定义的结构类型中定义的结构类型struct std_info,定义定义一个结构数组一个结构数组student,用于存储和显示三个学生的基本情况。用于存储和显示三个学生的基本情况。/*案例代码文件名:案例代码文件名:AL10_3.C*/#include#include struct.h/*定义并初始化一个外部结构数组定义并初始化一个外部结构数组student3*/struct std_info student3=“000102”,“张三张三”,“男男”,1980,9,20,“000105”,“李四李四”,
14、“男男”,1980,8,15,“000112”,“王五王五”,“女女”,1980,3,10 ;/*主函数主函数main()*/main()int i;/*打印表头打印表头:表示表示1个空格字符个空格字符*/printf(No.NameSexBirthdayn);/*输出三个学生的基本情况输出三个学生的基本情况*/for(i=0;ino);printf(Name:%sn,p_std-name);printf(Sex:%sn,p_std-sex);printf(Birthday:%d-%d-%dn,p_std-birthday.year,p_std-birthday.month,p_std-bir
15、thday.day);通通过过指指向向结结构构变变量量的的指指针针来来访访问问结结构构变变量量的的成成员员,与与直直接接使使用用结结构构变变量量的的效效果果一一样样。一一般般地地说说,如如果果指指针针变变量量pointer已已指指向向结结构构变量变量var(即(即pointer=&var),则以下三种形式等价:),则以下三种形式等价:(1)var.成员成员(2)pointer-成员成员(3)(*pointer).成成员员 /*“*pointer”外外面面的的括括号号不不能能省省!*/注注意意:在在格格式式(1)中中,分分量量运运算算符符左左侧侧的的运运算算对对象象,只只能能是是结结构构变变量量
16、,;而而在在格格式式(2)中中,指指向向运运算算符符左左侧侧的的运运算算对对象象,只只能能是是指向结构变量(或结构数组)的指针变量,否则都出错。指向结构变量(或结构数组)的指针变量,否则都出错。思思考考题题:如如果果要要求求从从键键盘盘上上输输入入结结构构变变量量student的的各各成成员员数数据据,如何修改程序?如何修改程序?AL10_4A.C10.4.2 指向结构数组的指针指向结构数组的指针案例案例10.5 使用指向结构数组的指针来访问结构数组。使用指向结构数组的指针来访问结构数组。/*案例代码文件名:案例代码文件名:AL10_5.C*/#includestruct.h/*定义并初始化一
17、个外部结构数组定义并初始化一个外部结构数组student*/struct std_info student3=000102,张三张三,男男,1980,5,20,000105,李四李四,男男,1980,8,15,“000112”,“王王 五五”,“女女”,1980,3,10;main()struct std_info *p_std=student;int i=0;/*打印表头打印表头*/printf(No.NameSexBirthdayn);/*输出结构数组内容输出结构数组内容*/for(;ino,p_std-name,p_std-sex);printf(%4d-%2d-%2dn,p_std-b
18、irthday.year,p_std-birthday.month,p_std-birthday.day);程序演示程序演示如如果果指指针针变变量量p已已指指向向某某结结构构数数组组,则则p+1指指向向结结构构数数组组的的下下一一个元素,而不是当前元素的下一个成员。个元素,而不是当前元素的下一个成员。10.4.3 指向结构数据的指针作函数参数指向结构数据的指针作函数参数案案例例10.6 用用函函数数调调用用方方式式,改改写写案案例例10.5:编编写写一一个个专专门门的的显示函数显示函数display(),通过主函数调用来实现显示。通过主函数调用来实现显示。/*案例代码文件名:案例代码文件名:A
19、L10_6.C*/#includestruct.h/*定义并初始化一个外部结构数组定义并初始化一个外部结构数组student*/struct std_info student3=000102,张张 三三,男男,1980,5,20,000105,李李四四,男男,1980,8,15,“000112”,“王王五五”,“女女”,1980,3,10;/*主函数主函数main()*/main()void display();/*函数说明函数说明*/int i=0;/*打印表头打印表头*/printf(No.NameSexBirthdayn);/*打印内容打印内容*/for(;ino,p_std-name,
20、p_std-sex);printf(%4d-%2d-%2dn,p_std-birthday.year,p_std-birthday.month,p_std-birthday.day);程序演示程序演示Return10.5 共用型简介共用型简介共用型共用型 1概念概念 使几个不同的变量占用同一段内存空间的结构称为共用型。使几个不同的变量占用同一段内存空间的结构称为共用型。2共用类型的定义共用类型的定义与结构类型的定义类似与结构类型的定义类似 union 共用类型名共用类型名 成员列表成员列表;3共用变量的定义共用变量的定义与结构变量的定义类似与结构变量的定义类似(1)间接定义间接定义先定义类型、
21、再定义变量先定义类型、再定义变量例如,定义例如,定义data共用类型变量共用类型变量un1,un2,un3的语句如下:的语句如下:union data un1,un2,un3;(2)直接定义直接定义定义类型的同时定义变量定义类型的同时定义变量例如,例如,union data int i;char ch;float f;un1,un2,un3;共共用用变变量量占占用用的的内内存存空空间间,等等于于最最长长成成员员的的长长度度,而而不不是是各各成成员长度之和。员长度之和。例例如如,共共用用变变量量un1、un2和和un3,在在16位位操操作作系系统统中中,占占用用的的内存空间均为字节(不是内存空间
22、均为字节(不是2+1+4=7字节)。字节)。共共用用变变量量的的引引用用与与结结构构变变量量一一样样,也也只只能能逐逐个个引引用用共共用变量的成员用变量的成员例例如如,访访问问共共用用变变量量un1各各成成员员的的格格式式为为:un1.i、un1.ch、un1.f。案例案例10.9共用体变量的引用共用体变量的引用(AL10_9.C)5特点特点(1)系系统统采采用用覆覆盖盖技技术术,实实现现共共用用变变量量各各成成员员的的内内存存共共享享,所所以以在某一时刻,存放的和起作用的是最后一次存入的成员值。在某一时刻,存放的和起作用的是最后一次存入的成员值。例例如如,执执行行un1.i=1,un1.ch
23、=c,un1.f=3.14后后,un1.f才才是是有有效效的成员。的成员。(2)由由于于所所有有成成员员共共享享同同一一内内存存空空间间,故故共共用用变变量量与与其其各各成成员员的地址相同。的地址相同。例如,例如,un1un1.iun1.chun1.f。(3)不不能能对对共共用用变变量量进进行行初初始始化化(注注意意:结结构构变变量量可可以以);也也不不能能将将共共用用变变量量作作为为函函数数参参数数,以以及及使使函函数数返返回回一一个个共共用用数数据据,但但可以使用指向共用变量的指针。可以使用指向共用变量的指针。(4)共用类型可以出现在结构类型定义中,反之亦然。共用类型可以出现在结构类型定义
24、中,反之亦然。10.6 定义已有类型的别名定义已有类型的别名除可直接使用提供的除可直接使用提供的标准类型标准类型和和自定义的类型自定义的类型(结构、共用、(结构、共用、枚举)外,也可使用枚举)外,也可使用typedef定义已有类型的别名定义已有类型的别名。该别名与标准类型。该别名与标准类型名一样,可用来定义相应的变量。名一样,可用来定义相应的变量。定义已有类型别名的方法如下:定义已有类型别名的方法如下:(1)按定义变量的方法,写出定义体;)按定义变量的方法,写出定义体;(2)将变量名换成别名;)将变量名换成别名;(3)在定义体最前面加上)在定义体最前面加上typedef。案例案例10.10 给
25、实型给实型float定义定义1个别名个别名REAL。(1)按定义实型变量的方法,写出定义体:按定义实型变量的方法,写出定义体:float f;(2)将变量名换成别名:将变量名换成别名:float REAL;(3)在定义体最前面加上在定义体最前面加上typedef:typedef float REAL;案例案例10.10 给如下所示的结构类型给如下所示的结构类型struct date定义定义1个别名个别名DATE。struct date int year,month,day;(1)按定义结构变量的方法,写出定义体:按定义结构变量的方法,写出定义体:struct date d;(2)将变量名换成别
26、名:将变量名换成别名:struct date DATE;(3)在定义体最前面加上在定义体最前面加上typedef:typedef struct date DATE;说明:说明:(1)用用typedef只只是是给给已已有有类类型型增增加加个个别别名名,并并不不能能创创造造个个新新的的类类型型。就就如如同同人人一一样样,除除学学名名外外,可可以以再再取取一一个个小小名名(或或雅雅号号),但但并不能创造出另一个人来。并不能创造出另一个人来。(2)typedef与与#define有有相相似似之之处处,但但二二者者是是不不同同的的:前前者者是是由由编编译译器器在在编编译译时时处处理理的的;后后者者是是由
27、由编编译译预预处处理理器器在在编编译译预预处处理理时时处处理理的的,而且只能作简单的字符串替换。而且只能作简单的字符串替换。Return2007年4月1、有以下程序typedef structint b,p;A;void f(A c)/*注意:c是结构变量名*/int j;c.b+=1;c.p+=2;main()int i;A a=1,2;f(a);printf(“%d,%dn”,a.b,a.p);程序运行后的输出结果是()A)2,3 B)2,4 C)1,4 D)1,22007年4月2、有以下程序、有以下程序struct S int n;int a20;void f(struct S *p)i
28、nt i,j,t;for(i=0;in-1;i+)for(j=i+1;jn;j+)if(p-aip-aj)t=p-ai;p-ai=p-aj;p-aj=t;main()int i;struct S s=10,2,3,1,6,8,7,5,4,10,9;f(&s);for(i=0;i s.n;i+)printf(“%d”,s.ai);程序运行后的输出结果是程序运行后的输出结果是()A)1,2,3,4,5,6,7,8,9,10,B)10,9,8,7,6,5,4,3,2,1,C)2,3,1,6,8,7,5,4,10,9,D)10,9,8,7,6,1,2,3,4,5,2007年4月3、有以下程序、有以下程
29、序struct S int n;int a20;void f(int *a,int n)int i;for(i=0;in-1;i+)ai+=i;main()int i;struct S s=10,2,3,1,6,8,7,5,4,10,9;f(s.a,s.n);for(i=0;is.n;i+)printf(“%d”,s.ai);程序运行后的输出结果是程序运行后的输出结果是()A)2,4,3,9,12,12,11,11,18,9,B)3,4,2,7,9,8,6,5,11,10,C)2,3,1,6,8,7,5,4,10,9,D)1,2,3,6,8,7,5,4,10,9,2007年4月4、设有说明、设
30、有说明struct DATEint year;int month;int day;请写出一条定义语句,该语句定义请写出一条定义语句,该语句定义d为上述结构体变量,并同时为其为上述结构体变量,并同时为其成员成员year、month、day 依次赋初值依次赋初值2006、10、1:_struct DATA d=2006,10,1;2007年9月1、以下关于、以下关于typedef的叙述错误的是的叙述错误的是A)用用typedef可以增加新类型可以增加新类型B)typedef只是将已存在的类型用一个新的名字来代表只是将已存在的类型用一个新的名字来代表C)用用typedef可以为各种类型说明一个新名可
31、以为各种类型说明一个新名,但不能用来为变量说明但不能用来为变量说明一个新名一个新名D)用用typedef为类型说明一个新名为类型说明一个新名,通常可以增加程序的可读性通常可以增加程序的可读性2007年9月2、有以下程序、有以下程序#includestructttintx;structtt*y;*p;structtta4=20,a+1,15,a+2,30,a+3,17,a;main()inti;p=a;for(i=1;ix);p=p-y;程序的运行结果是程序的运行结果是A)20,30,B)30,17C)15,30,D)20,15,2007年9月3、有以下程序、有以下程序#include#incl
32、udetypedefstructcharname9;charsex;floatscore2;STU;STUf(STUa)STUb=Zhao,m,85.0,90.0;inti;strcpy(a.name,b.name);a.sex=b.sex;for(i=0;i2;i+)a.scorei=b.scorei;returna;main()STUc=Qian,f,95.0,92.0,d;d=f(c);printf(%s,%c,%2.0f,%2.0fn,d.name,d.sex,d.score0,d.score1);程序的运行结果是程序的运行结果是A)Qian,f,95,92B)Qian,m,85,90
33、C)Zhao,m,85,90D)Zhao,f,95,922007年9月4、设有以下定义、设有以下定义uniondataintd1;floatd2;demo;则下面叙述中错误的是则下面叙述中错误的是A)变量变量demo与成员与成员d2所占的内存字节数相同所占的内存字节数相同B)变量变量demo中各成员的地址相同中各成员的地址相同C)变量变量demo和各成员的地址相同和各成员的地址相同D)若给若给demo.d1赋赋99后后,demo.d2中的值是中的值是99.02008年4月1、以下结构体类型说明和变量定义中正确的是、以下结构体类型说明和变量定义中正确的是A)typedefstructB)stru
34、ctREC;intn;charc;REC;intn;charc;REC t1,t2;REC t1,t2;C)typedefstructREC;D)structintn=0;char c=A;t1,t2;intn;charc;REC;RECt1,t2;2008年4月2、有以下程序、有以下程序#include#includetypedefstructcharname9;charsex;floatscore2;STU;voidf(STUa)STUb=Zhao,m,85.0,90.0;int i;strcpy(a.name,b.name);a.sex=b.sex;for(i=0;i2;i+)a.sco
35、rei=b.scorei;main()STUc=Qian,f,95.0,92.0;f(c);printf(%s,%c,%2.0f,%2.0fn,c.name,c.sex,c.score0,c.score1);程序的运行结果是程序的运行结果是A)Qian,f,95,92B)Qian,m,85,90C)Zhao,f,95,92D)Zhao,m,85,902008年4月3、以下程序中函数、以下程序中函数fun的功能是:统计的功能是:统计person所指结构体数组中所有性别所指结构体数组中所有性别(sex)为为M的记录的个数,存入变量的记录的个数,存入变量n中,并作为函数值返回。请填空。中,并作为函数
36、值返回。请填空。#include#defineN3typedefstructintnum;charnam10;charsex;SS;intfun(SSperson)inti,n=0;for(i=0;iN;i+)if(【14】=M)n+;returnn;main()SSWN=1,AA,F,2,BB,M,3,CC,M;intn;n=fun(W);printf(n=%dn,n);personi.sex2008年9月1、有以下程序、有以下程序#includestructst intx,y;data2=1,10,2,20;main()structst*p=data;printf(%d,p-y);prin
37、tf(%dn,(+p)-x);程序的运行结果是程序的运行结果是A)10,1B)20,1C)10,2D)20,22008年9月2、#include main()struct STU charname9;char sex;double score2;struct STUa=Zhao,m,85.0,90.0,b=Qian,f,95.0,92.0;b=a;printf(%s,%c,%2.0f,%2.0fn,b.name,b.sex,b.score0,b.score1);程序的运行结果是程序的运行结果是A)Qian,f,95,92B)Qian,m,85,90C)Zhao,f,95,92D)Zhao,m,
38、85,902009年3月1、有以下程序、有以下程序#includestructordintx,y;dt2=1,2,3,4;main()structord*p=dt;printf(%d,+p-x);printf(%dn,+p-y);程序的运行结果是程序的运行结果是A)1,2 B)2,3 C)3,4 D)4,1注意:运算符注意:运算符-的优先级高于的优先级高于+2009年3月2、下列程序的运行结果为、下列程序的运行结果为【1001,ChangRong,1098.0 】#include#includestructAinta;charb10;doublec;voidf(structA*t);main(
39、)structAa=1001,ZhangDa,1098.0;f(&a);printf(%d,%s,%6.1fn,a.a,a.b,a.c);voidf(structA*t)strcpy(t-b,ChangRong);2009年9月1、下面结构体的定义语句中,错误的是、下面结构体的定义语句中,错误的是A)structordintx;inty;intz;structorda;B)structordintx;inty;I ntz;structorda;C)structordintx;inty;intz;n;D)structintx;inty;intz;a;2009年9月2、有以下程序、有以下程序#in
40、clude#includestructAinta;charb10;doublec;structAf(structAt);main()structAa=1001,ZhangDa,1098.0;a=f(a);printf(%d,%s,%6.1fn,a.a,a.b,a.c);structAf(structAt)t.a=1002;strcpy(t.b,ChangRong);t.c=1202.0;returnt;程序运行后的输出结果是程序运行后的输出结果是A)1001,ZhangDa,1098.0 B)1002,ZhangDa,1202.0C)1001,ChangRong,1098.0 D)1002,ChangRong,1202.0 2009年9月3、设有定义、设有定义structpersonintID;charname12;p;请将请将scanf(%d,【】);语句补充完整语句补充完整,使其能够为结构体使其能够为结构体变量变量p的成员的成员ID正确读入数据。正确读入数据。4、有以下程序、有以下程序#includetypedefstructintnum;doubles;REC;voidfun1(RECx)x.num=23;x.s=88.5;main()RECa=16,90.0;fun1(a);printf(%dn,a.num);程序运行后的输出结果是程序运行后的输出结果是【】&p.ID16