一、单选题(50*1.5 分=75 分)
1.下面判断正确的是
A、char *a=”china”; 等价于 char *a; *a=”china” ;
B、char str[10]={“china”}; 等价于 char str[10]; str[ ]={“china”;}
C、char *s=”china”; 等价于 char *s; s=”china” ;
D、char c[4]=”abc”,d[4]=”abc”; 等价于 char c[4]=d[4]=”abc” ;
A中*a不是指针,不能指向字符串
B.字符串必须在定义时才可初始化
D.char c[4]=d[4]="abc"为非法书写
2.下面程序段中,for 循环的执行次数是
char *s=“\ta\018bc” ;
for ( ; *s!=’\0’ ; s++)
printf(“*”) ;
A、9
B、7
C、6
D、5
\t为分隔符,\0为空字符,除去空符,则总共循环6次
3.下面能正确进行字符串赋值操作的是
A、char s[5]={“ABCDE”};
B、char s[5]={‘A’,’B’,’C’,’D’,’E’};
C、char *s ; s=“ABCDE” ;
D、char *s; scanf(“%s”,s) ;
A书写错误
B是5个字符赋值
D违反scanf输入规则
5.设 p1 和 p2 是指向同一个字符串的指针变量,c 为字符变量,则以下不能正确执行的赋值语句
A、c=*p1+*p2
B、p2=c
C、p1=p2
D、c=*p1*(*p2)
p2是指针,c是变量,两者不等价故不能赋值
8.以下说明不正确的是
A、char a[10]=”china” ;
B、char a[10],*p=a; p=”china”;
C、char *a; a=”china” ;
D、char a[10],*p; p=a=”china”;
D违反书写规则,且p为指针,a为变量,两者不等价
14.以下程序的输出结果是
#include<stdio.h>
#include<string.h>
void main()
{
char *p1,*p2,str[50]="ABCDEFG";
p1="abcd";
p2="efgh";
strcpy(str+1,p2+1);
strcpy(str+3,p1+3);
printf("%s",str);
}
A、AfghdEFG
B、Abfhd
C、Afhgd
D、Afgd
strcpy有覆写的功能,其语法为strcpy(目的地址,来源地址);
str+1为字符串str中B的地址
p2+1为字符串p2中f的地址
用字符串p2中从f开始的字符串覆写str中B开始的字符串,得到"Afgh"
str+3为字符串str中h的地址
p1+3为字符串p1中d的地址
用字符串p2中从d开始的字符串覆写str中h开始的字符串,得到"Afgd"
38.变量 a 所占的内存字节数是。(假设整型 int 为 4 字节,long int 为 8 字节)
struct stu
{ char name[20];
long int n;
int score[4];
} a ;
A、 28
B、 30
C、 44
D、 48
单位字符变量开辟空间为1byte
单位整型变量开辟空间为4byte
单位长变量开辟空间为8byte
对齐原则
以多少个字节为单位开辟内存 ,结构体成员中,占字节数最大的类型长度和value比较,
取较小值,为单位开辟内存
开辟的空间为8byte的整数倍
20+8+16=44不能被8整除
故开辟的空间为48byte
46.若有以下说明和定义语句,则变量 w 在内存中所占的字节数是
union aa {float x;float y;char c[6];};
struct st {union aa v;float w[5];double ave;}w;
A、42
B、34
C、30
D、26
基于对齐原则,开辟空间大小应为double占用空间的整数倍
.联合体大小的计算
●联合的大小至少是最大成员的大小。
●当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
故联合体aa的大小受制于字符串c和浮点型,需要同时满足字符串c的最大容量6byte和浮点型数据空间4byte的整数倍,故为8byte
结构体开辟空间须大于8+20+8=36byte,故为49byte