7.1 單項(xiàng)選擇題
1.設(shè)有定義"struct {int x;int y;} d[2]={{1,3},{2, 7}};",則
printf("%d\n", d[0].y/d[0].x*d[l].x);的輸出是( )
①O ②l
③3 ④6
【解】結(jié)構(gòu)數(shù)組d有兩個(gè)結(jié)構(gòu)元素,每個(gè)結(jié)構(gòu)又由兩個(gè)整型成分組成,初始化后,d[0].x=1,d[0].y=3,d[1].x=2。所以表達(dá)式d[0].y/d[0].x* d[l].x的值是 6。所以正確解答是④。
2.設(shè)有定義"enum term { my, your=4, his, her=his+10};",則
printf("%d,%d,%d,%d\n",my, your, his, her);
的輸出是( )
①0,l,2,3 ②0,4,0,10
③0,4,5,15 ④1,4,5,15
【解】按枚舉類型定義的規(guī)定,枚舉類型team的枚舉常量對(duì)應(yīng)的整數(shù)分別是my=0、your=4、his=5、her=15。所以語(yǔ)句輸出0,4,5,15。正確解答是③。
3.以下對(duì)枚舉類型名的定義中,正確的是()
①enum a ={one,two,three};
② enum a{a1, a2,a3};
③enum a ={’1’,’2’,’3’};
④ enum a {"one","two","three" };
【解】枚舉類型定義的句法是:
enum 枚舉類型名 {枚舉類型常量1,枚舉類型常量2,……};
其中枚舉類型常量都是互不相同的標(biāo)識(shí)符。所以定義enum a {a1,a2,a3 };
是一個(gè)正確的定義。任何在枚舉類型名之后接上 =,或用字符常量,或用字符串常量作為枚舉類型常量都是不正確的定義。解答應(yīng)是②。
4.若有如下定義,則 printf("%d\n", sizeof(them));的輸出是( )
typedef union { lOng x[2];int y[4];char z[8];} MYTYPE;MYTYPE them;
①32 ②16 ③8 ④24
【解】共用型變量的成分是覆蓋存儲(chǔ),為共用型變量分配存儲(chǔ)時(shí),以其中需要最多存儲(chǔ)字節(jié)的成分進(jìn)行分配。設(shè)long型數(shù)據(jù)占4個(gè)字節(jié)、int型數(shù)據(jù)占2個(gè)字節(jié)。共用型MYTYPE有三個(gè)成分,第一個(gè)成分是有兩個(gè)long型元素的數(shù)組,它需要8個(gè)字節(jié);第二個(gè)成分是有4個(gè)int型元素的數(shù)組,它也需要8個(gè)字節(jié);第三個(gè)成分是有8個(gè)字符元素的數(shù)組,也是8個(gè)字節(jié)。所以MYTYPE類型的共用型變量只需要8個(gè)字節(jié)。正確解答是③。
5.設(shè)有以下說(shuō)明和定義:
typedef union {long i;int k[5]; char c;} DATE;
struct date {int cat; DATE cow; double dog;} too;
DATE max;
則下列語(yǔ)句的執(zhí)行結(jié)果是( )
printh("%d",sizeof(struct date)+sizeof(max));
① 26 ② 30
③ 18 ④ 8
【解】設(shè)long型數(shù)據(jù)占4個(gè)字節(jié)、int型數(shù)據(jù)占2個(gè)字節(jié),double數(shù)據(jù)占8個(gè)字節(jié)。共用型DATE有三個(gè)成分:long型成分i,有五個(gè)int型元素的數(shù)組k,char型成分 c。所以 DATE類型的變量需要10個(gè)字節(jié)。結(jié)構(gòu)類型date有三個(gè)成分:int型成分cat,DATE共用類型cow, double型成分dog。所以結(jié)構(gòu)類型 date需要20個(gè)字節(jié)。所以表達(dá)式 sizeof(struct date)+sizeof max的值是30。正確解答是②。
6.根據(jù)下面的定義,能打印出字母M的語(yǔ)句是( )
struct person {char name[9]; int age; };
struct person c[1O] = {{"John",17 },{"Paul",19 },{"Mary",18 },{"Adam",16 }};
① printf("%c", c[3].name); ② printf("%c", c[3].name[1] );
③printf("%c",c[2].name[1]); ④printf("%c",c[2].name[0] );
【解】結(jié)構(gòu)類型struct person有兩個(gè)成分:九個(gè)元素的字符數(shù)組name和一個(gè)基本整型age。元素類型為 struct person的數(shù)組c有10個(gè)元素,其中前四個(gè)元素被設(shè)定了初值。在已設(shè)定初值的元素中,只有c[2].mame[0]的值是字符M。其余元素及元素的成分都不是字符比正確解答是④。
7.設(shè)有如下定義,則對(duì)data中的a成員的正確引用是( )
struct sk{int a;float b;} data,*p= & data;
①(*p).data.a ②(*p).a ③ p -> data.a ④ p.data.a
【解】結(jié)構(gòu)變量data有兩個(gè)成分a和b。結(jié)構(gòu)指針變量p指向結(jié)構(gòu)變量data。引用結(jié)構(gòu)變量data的成分a有兩種方法:一是直接由變量data引用其自己的成分a,寫成data.a;二是通過(guò)指針變量p引用它所指的結(jié)構(gòu)的成分a,這又有兩種寫法,分別是p -> a和(*p).a。正確解答是②。
7.2 填充題
1.運(yùn)算符"."稱為_(kāi)_________運(yùn)算符,運(yùn)算符" -> "稱為_(kāi)_________運(yùn)算符。
【解】引用結(jié)構(gòu)變量或共用型變量的成分用成員運(yùn)算符’.’,若某指針指向一個(gè)結(jié)構(gòu)變量或共用型變量,通過(guò)指針引用它所指變量的成分用指向成員運(yùn)算符’ -> ’。
2.設(shè)有定義"struct {int a; float b; char c;} abc,*p_abc=&abc;",則對(duì)結(jié)構(gòu)體成員a的引用方法可以是abc_________a和p_abc___________a。
【解】若有結(jié)構(gòu)變量abc有成分a,并有指針p_abc指向結(jié)構(gòu)變量abc,則引用變量abc成分a的標(biāo)記形式有abc.a和p_abc ->a。
3.若有以下說(shuō)明和定義語(yǔ)句,則變量W在內(nèi)存中所占的字節(jié)數(shù)是__________。
union aa {float x;float y; char c[6]; };
struct st { union aa v; float w[5]; double ave; } w;
【解】共用型aa有三個(gè)成分,一個(gè)是float型成分x,一個(gè)是float型成分y,再一個(gè)是有六個(gè)元素的字符數(shù)組。若float型數(shù)據(jù)占4個(gè)字節(jié),則類型aa數(shù)據(jù)要占用6個(gè)字節(jié)。結(jié)構(gòu)變量w有三個(gè)成分,一個(gè)是共用型成分aa,要占用6個(gè)字節(jié);一個(gè)是有5個(gè)float型元素的數(shù)組w,要占用20個(gè)字節(jié);再一個(gè)是double型的ave。若doube型數(shù)據(jù)要8個(gè)字節(jié),則結(jié)構(gòu)變量w要占用34個(gè)字節(jié)。
7.3 程序分析題
1.閱讀下列程序,寫出運(yùn)行結(jié)果。(字符0的ASCII碼為十六進(jìn)制的30)
main()
{ union { char c; char i[4]; } z;
z.i[0]= 0x39;z.i[1]= 0x36;
printf("%c \n", z.c);
}
【解】共用型變量z有兩個(gè)成分,一個(gè)是字符型的c,另一個(gè)是有4個(gè)字符的數(shù)組i。由于共用型的成分是覆蓋存儲(chǔ),成分c的內(nèi)容也是成分i的首元素。程序給Z的i成分的首元素置十六進(jìn)制代碼0x39,即十進(jìn)制數(shù)57。數(shù)57是字符’9’的ASCII代碼。用字符輸出格式,輸出該變量的值,將輸出字符’9’ 。
2.閱讀下列程序,寫出程序的運(yùn)行結(jié)果。
main ()
{ struct student
{ char name[10];
float k1;
float k2;
} a[2]={ {"zhang", 100,70} ,{"wang",70,80 } },* p=a;
int i;
printf("\nname:%s total=%f",p ->name,p -> k1+p -> k2);
printf("\nname:%s total=%f",a[l].name, a[1].k1+a[l].k2);
}
【解】結(jié)構(gòu)數(shù)組a 有兩個(gè)元素,每個(gè)元素有三個(gè)成分:10個(gè)元素的字符數(shù)組和兩個(gè)類型為float的成分k1、k2。結(jié)構(gòu)指針變量p指向結(jié)構(gòu)數(shù)組a的首元素。其中初始化使a的兩個(gè)元素分別有值如下:
a[0].name="zhang",a[0].k1= 100.0,a[0].k2=70.0,
a[1].name="wang",
a[l].k1=70.0, a[1].k2 =80.0。所以程序運(yùn)行后輸出:
name:zhang total = 170.000000
name: wang total= 150.000000
3.閱讀下列程序,寫出程序的運(yùn)行結(jié)果。
main ( )
{ enum em { em1=3, em2=l, em3 };
char * aa[] = {"AA","BB","CC","DD" };
printf("%s%s%s\n",aa[em1],aa[em2], aa[em3] );
}
【解】由枚舉類型測(cè)的定義知,枚舉類型常量em1的值是3,枚舉類型常量em2的值是1,枚舉類型常量em3的值是2。所以程序運(yùn)行后輸出:
DD BB CC
1.設(shè)有定義"struct {int x;int y;} d[2]={{1,3},{2, 7}};",則
printf("%d\n", d[0].y/d[0].x*d[l].x);的輸出是( )
①O ②l
③3 ④6
【解】結(jié)構(gòu)數(shù)組d有兩個(gè)結(jié)構(gòu)元素,每個(gè)結(jié)構(gòu)又由兩個(gè)整型成分組成,初始化后,d[0].x=1,d[0].y=3,d[1].x=2。所以表達(dá)式d[0].y/d[0].x* d[l].x的值是 6。所以正確解答是④。
2.設(shè)有定義"enum term { my, your=4, his, her=his+10};",則
printf("%d,%d,%d,%d\n",my, your, his, her);
的輸出是( )
①0,l,2,3 ②0,4,0,10
③0,4,5,15 ④1,4,5,15
【解】按枚舉類型定義的規(guī)定,枚舉類型team的枚舉常量對(duì)應(yīng)的整數(shù)分別是my=0、your=4、his=5、her=15。所以語(yǔ)句輸出0,4,5,15。正確解答是③。
3.以下對(duì)枚舉類型名的定義中,正確的是()
①enum a ={one,two,three};
② enum a{a1, a2,a3};
③enum a ={’1’,’2’,’3’};
④ enum a {"one","two","three" };
【解】枚舉類型定義的句法是:
enum 枚舉類型名 {枚舉類型常量1,枚舉類型常量2,……};
其中枚舉類型常量都是互不相同的標(biāo)識(shí)符。所以定義enum a {a1,a2,a3 };
是一個(gè)正確的定義。任何在枚舉類型名之后接上 =,或用字符常量,或用字符串常量作為枚舉類型常量都是不正確的定義。解答應(yīng)是②。
4.若有如下定義,則 printf("%d\n", sizeof(them));的輸出是( )
typedef union { lOng x[2];int y[4];char z[8];} MYTYPE;MYTYPE them;
①32 ②16 ③8 ④24
【解】共用型變量的成分是覆蓋存儲(chǔ),為共用型變量分配存儲(chǔ)時(shí),以其中需要最多存儲(chǔ)字節(jié)的成分進(jìn)行分配。設(shè)long型數(shù)據(jù)占4個(gè)字節(jié)、int型數(shù)據(jù)占2個(gè)字節(jié)。共用型MYTYPE有三個(gè)成分,第一個(gè)成分是有兩個(gè)long型元素的數(shù)組,它需要8個(gè)字節(jié);第二個(gè)成分是有4個(gè)int型元素的數(shù)組,它也需要8個(gè)字節(jié);第三個(gè)成分是有8個(gè)字符元素的數(shù)組,也是8個(gè)字節(jié)。所以MYTYPE類型的共用型變量只需要8個(gè)字節(jié)。正確解答是③。
5.設(shè)有以下說(shuō)明和定義:
typedef union {long i;int k[5]; char c;} DATE;
struct date {int cat; DATE cow; double dog;} too;
DATE max;
則下列語(yǔ)句的執(zhí)行結(jié)果是( )
printh("%d",sizeof(struct date)+sizeof(max));
① 26 ② 30
③ 18 ④ 8
【解】設(shè)long型數(shù)據(jù)占4個(gè)字節(jié)、int型數(shù)據(jù)占2個(gè)字節(jié),double數(shù)據(jù)占8個(gè)字節(jié)。共用型DATE有三個(gè)成分:long型成分i,有五個(gè)int型元素的數(shù)組k,char型成分 c。所以 DATE類型的變量需要10個(gè)字節(jié)。結(jié)構(gòu)類型date有三個(gè)成分:int型成分cat,DATE共用類型cow, double型成分dog。所以結(jié)構(gòu)類型 date需要20個(gè)字節(jié)。所以表達(dá)式 sizeof(struct date)+sizeof max的值是30。正確解答是②。
6.根據(jù)下面的定義,能打印出字母M的語(yǔ)句是( )
struct person {char name[9]; int age; };
struct person c[1O] = {{"John",17 },{"Paul",19 },{"Mary",18 },{"Adam",16 }};
① printf("%c", c[3].name); ② printf("%c", c[3].name[1] );
③printf("%c",c[2].name[1]); ④printf("%c",c[2].name[0] );
【解】結(jié)構(gòu)類型struct person有兩個(gè)成分:九個(gè)元素的字符數(shù)組name和一個(gè)基本整型age。元素類型為 struct person的數(shù)組c有10個(gè)元素,其中前四個(gè)元素被設(shè)定了初值。在已設(shè)定初值的元素中,只有c[2].mame[0]的值是字符M。其余元素及元素的成分都不是字符比正確解答是④。
7.設(shè)有如下定義,則對(duì)data中的a成員的正確引用是( )
struct sk{int a;float b;} data,*p= & data;
①(*p).data.a ②(*p).a ③ p -> data.a ④ p.data.a
【解】結(jié)構(gòu)變量data有兩個(gè)成分a和b。結(jié)構(gòu)指針變量p指向結(jié)構(gòu)變量data。引用結(jié)構(gòu)變量data的成分a有兩種方法:一是直接由變量data引用其自己的成分a,寫成data.a;二是通過(guò)指針變量p引用它所指的結(jié)構(gòu)的成分a,這又有兩種寫法,分別是p -> a和(*p).a。正確解答是②。
7.2 填充題
1.運(yùn)算符"."稱為_(kāi)_________運(yùn)算符,運(yùn)算符" -> "稱為_(kāi)_________運(yùn)算符。
【解】引用結(jié)構(gòu)變量或共用型變量的成分用成員運(yùn)算符’.’,若某指針指向一個(gè)結(jié)構(gòu)變量或共用型變量,通過(guò)指針引用它所指變量的成分用指向成員運(yùn)算符’ -> ’。
2.設(shè)有定義"struct {int a; float b; char c;} abc,*p_abc=&abc;",則對(duì)結(jié)構(gòu)體成員a的引用方法可以是abc_________a和p_abc___________a。
【解】若有結(jié)構(gòu)變量abc有成分a,并有指針p_abc指向結(jié)構(gòu)變量abc,則引用變量abc成分a的標(biāo)記形式有abc.a和p_abc ->a。
3.若有以下說(shuō)明和定義語(yǔ)句,則變量W在內(nèi)存中所占的字節(jié)數(shù)是__________。
union aa {float x;float y; char c[6]; };
struct st { union aa v; float w[5]; double ave; } w;
【解】共用型aa有三個(gè)成分,一個(gè)是float型成分x,一個(gè)是float型成分y,再一個(gè)是有六個(gè)元素的字符數(shù)組。若float型數(shù)據(jù)占4個(gè)字節(jié),則類型aa數(shù)據(jù)要占用6個(gè)字節(jié)。結(jié)構(gòu)變量w有三個(gè)成分,一個(gè)是共用型成分aa,要占用6個(gè)字節(jié);一個(gè)是有5個(gè)float型元素的數(shù)組w,要占用20個(gè)字節(jié);再一個(gè)是double型的ave。若doube型數(shù)據(jù)要8個(gè)字節(jié),則結(jié)構(gòu)變量w要占用34個(gè)字節(jié)。
7.3 程序分析題
1.閱讀下列程序,寫出運(yùn)行結(jié)果。(字符0的ASCII碼為十六進(jìn)制的30)
main()
{ union { char c; char i[4]; } z;
z.i[0]= 0x39;z.i[1]= 0x36;
printf("%c \n", z.c);
}
【解】共用型變量z有兩個(gè)成分,一個(gè)是字符型的c,另一個(gè)是有4個(gè)字符的數(shù)組i。由于共用型的成分是覆蓋存儲(chǔ),成分c的內(nèi)容也是成分i的首元素。程序給Z的i成分的首元素置十六進(jìn)制代碼0x39,即十進(jìn)制數(shù)57。數(shù)57是字符’9’的ASCII代碼。用字符輸出格式,輸出該變量的值,將輸出字符’9’ 。
2.閱讀下列程序,寫出程序的運(yùn)行結(jié)果。
main ()
{ struct student
{ char name[10];
float k1;
float k2;
} a[2]={ {"zhang", 100,70} ,{"wang",70,80 } },* p=a;
int i;
printf("\nname:%s total=%f",p ->name,p -> k1+p -> k2);
printf("\nname:%s total=%f",a[l].name, a[1].k1+a[l].k2);
}
【解】結(jié)構(gòu)數(shù)組a 有兩個(gè)元素,每個(gè)元素有三個(gè)成分:10個(gè)元素的字符數(shù)組和兩個(gè)類型為float的成分k1、k2。結(jié)構(gòu)指針變量p指向結(jié)構(gòu)數(shù)組a的首元素。其中初始化使a的兩個(gè)元素分別有值如下:
a[0].name="zhang",a[0].k1= 100.0,a[0].k2=70.0,
a[1].name="wang",
a[l].k1=70.0, a[1].k2 =80.0。所以程序運(yùn)行后輸出:
name:zhang total = 170.000000
name: wang total= 150.000000
3.閱讀下列程序,寫出程序的運(yùn)行結(jié)果。
main ( )
{ enum em { em1=3, em2=l, em3 };
char * aa[] = {"AA","BB","CC","DD" };
printf("%s%s%s\n",aa[em1],aa[em2], aa[em3] );
}
【解】由枚舉類型測(cè)的定義知,枚舉類型常量em1的值是3,枚舉類型常量em2的值是1,枚舉類型常量em3的值是2。所以程序運(yùn)行后輸出:
DD BB CC