7.1 选择题
(456) 在c语言中,引用数组元素时,其数组下标的数据类型允许是____。
a. 整型常量 b. 整型表达式
c. 字符型常量 d. 任何类型的表达式
(a.b.c)
(457) 若有以下说明和语句:
struct student
{
int age;
int num;
}std, *p;
p=&std;
则以下对结构体变量std中成员age的引用方式正确的是_____。
a. std.age
b. p->age
c. (*p).age
d. *p.age
(a.b.c)
(458) 以下scanf函数调用语句中对结构体变量成员的不正确引用是_____。
struct pupil
{
char name[20];
int age;
int sex;
}pup[5], *p;
p=pup;
a. scanf("%s", pup[0].name);
b. scanf("%s", &pup[0].age);
c. scanf("%s", &(p->sex));
d. scanf("%s", p->age);
(b.c.d)
(459) 已知结构变量var, 指向该结构变量的指针p,下面获取结构体成员的写法错误的是_____。
a. var.成员
b. p->成员
c. (*p).成员
d. var->成员
(d)
(460) 若变量已正确定义并且指针p已经指向某个变量x,则(*p)++相当于_____。
a. p++ b. x++ c. *(p++) d. &x++
(b)
(461) 若p1、p2都是整型指针,p1已经指向变量x,要使p2也指向x, _____是正确的。
a. p2=p1; b. p2=**p1; c. p2=&p1; d. p2=*p1;
(a)
(462) 不正确的赋值或赋初值的方式是______。
a. char str[]="string";
b. char str[7]={'s', 't', 'r', 'i', 'n', 'g'};
c. char str[10];str="string";
d. char str[7]={'s', 't', 'r', 'i', 'n', 'g', '\0'};
(c)
(463) 对于以下结构定义,++p->str中的++加在_____。
struct
{
int len;
char *str;
} *p;
a. 指针str上 b. 指针p上 c. str指的内容上 d. 以上均不是
(a)
(464) 对于如下说明,语法和语义都正确的赋值是_____。
int c, *s, a[]={1, 3, 5};
a. c=*s; b. s[0]=a[0]; c. s=&a[1]; d. c=a;
(a.c)
(465) 设有说明int(*ptr)[m];其中的标识符ptr是_____。
a. m个指向整型变量的指针
b. 指向m个整型变量的函数指针
c. 一个指向具有m个整型元素的一维数组的指针
d. 具有M个指针元素的一维指针数组,每个元素都只能指向整型量
(c)
(466) 有下面的程序段:
char a[3],b[]="china";
a=b;
printf("%s",a);
则输出结果为_____。
a. 运行后输出china
b. 运行后输出ch
c. 运行后输出chi
d. 编译出错
(d)
(467) 下面的描述正确是_____。
a. 多维数组的存储是按最右维数的变量变化最快的原则。
b. 多维数组存储是连续的, 因此可以用一维数组初始化的办法来初始化多维数组。
c. 对数组初始化时, 如果初值表中的数据个数比数组元素少, 则不足的数组元素用0来填补。
d. 对指针型变量数组可以不规定维数, 在初始化赋值时, 数组维数从0 开始被连续赋值。
e. 对于字符串数组s,可以用"="直接赋值, 例如s="Good News!"是合法的。
(a.b.c.d)
(468) 设有以下语句,则_____不是对a数组元素的正确引用,其中0≤i<10。
int a[10]={0,1,2,3,4,5,6,7,8,9}, *p=a;
a. [p-a]
b. *(&a[i])
c. p[i]
d. *(*(a+i))
(d)
(469) 判断字符串s1是否大于字符串s2,应当使用_____。
a. if (s1>s2)
b. if (strcmp(s1,s2))
c. if (strcmp(s2,s1)>0)
d. if (strcmp(s1,s2)>0)
(d)
(470) 判断字符串a和b是否相等,应当使用_____。
a. if(a==b)
b. if(a=b)
c. if(strcpy(a,b))
d. if(strcmp(a,b))
(a.d)
(471) 下面程序段的运行结果是______。
char a[7]="abcdef";
char b[4]="ABC";
strcpy(a,b);
printf("%c",a[5]);
a. 空格
b. \0
c. e
d. f
(d)
(472) 下述关于字符数组的描述中错误的是______。
a. 字符数组可以存放字符串
b. 字符效组的字符串可以整体输入、输出
c. 可以在赋值语句中通过赋值运算符"="对字符数组整体赋值
d. 不可以用关系运算符对字符数组中的字符串进行比较
(b.c)
(473) 若有说明:int a[3][4]={0};则下面正确的叙述是______。
a. 只有元素a[0][0]可得到初值0
b. 此说明语句不正确
c. 数组a中各元素都可得到初值,但其值不-定为0
d. 数组a中每个元素均可得到初值0
(d)
(474) 以下数组定义中不正确的是______。
a. int a[2][3];
b. int b[][3] = {0,1,2,3};
c. int c[100][100] = {0};
d. int d[3][] = {{1,2},{1,2,3},{1,2,3,4}};
(d)
(475) 下面关于数组的说法正确的是______。
a. 数组名可以为指向相同类型的指针赋值;
b. 数组名是一个指针常量,不能被修改;
c. 数组名作为函数形参时,在函数体内可以被修改;
d. 数组名指代一种数据结构,这种数据结构就是数组。
(a.b.d)
(476) 设static char x[ ]=″12345″,y[ ]={′1′,′2′,′3′,′4′,′5′,′\0′};那么下面_______正确。
a. x数组的长度等于y数组的长度
b. x数组的长度大于y数组的长度
c. x数组的长度少于y数组的长度
d. x数组与y数组的存储区域相同
(a)
(477) 设char *s="\ta\017bc",则指针变量s指向的字符串所占的字节数是______。
a. 9
b. 5
c. 6
d. 7
(c)
(478) 若有以下定义,则对a数组元素的正确引用是______。
int a[5];
int *p=a;
a. *&a[5]
b. a+2
c. *(p+5)
d. *(a+2)
(a)
(479) 以下与int *q[5];等价的定义语句是______。
a. int q[5]
b. int *q
c. int *(q[5]);
d. int (*q)[5]
(c)
(480) 若有以下定义和语句,则对a数组元素的正确引用为_____。
int a[2][3];
int (*p)[3];
p=a;
a. (p+1)[0]
b. *(*(p+2)+1)
c. *(p[1]+1)
d. p[1]+2
()
(481) 若有以下定义和赋值语句,则对数组的第i行第j列(假设i,j已正确说明并赋值)元素地址的合法引用为_____。
int b[2][3]={0};
int (*p)[3];
p=b;
a. *(*(p+i)+j
b. *(p[i]+j)
c. *(p+i)+j
d. (*(p+i))[j]
(482) 若有说明语句
char a[]="Message";
char *p="Message";
则以下不正确的叙述是______。
a. a+1表示的是字符e的地址
b. p指向另外的字符串时,字符串的长度不受限制
c. p变量中存放的地址值可以改变
d. a中只能存放7个字符
(d)
(483) 以下正确的叙述是_____。
a. C语言允许main函数带形参,且形参个数和形参名均可由用户指定
b. c语言允许main函数带形参,形参名只能是,argc和,argv
c. 当main函数带有形参时,传给形参的值只能从命令行中得到
d. 若有说明:main(int argc,char *argv),则形参argc的值必须大于1
(a)
(484) main函数的正确说明形式是_____。
a. main(int argc,char *argv)
b. main(int abc,char **abv)
c. main(int argc,char argv)
d. main(int c,char v[])
(b)
(485) 语句int (*ptr)();的含义是_____。
a. ptr是指向-维数组的指针变量
b. ptr是指向int型数据的指针变量
c. ptr是指向函数的指针,该函数返回-个int型数据
d. ptr是-个函数名,该函数的返回值是指向int型数据的指针
(c)
(486) 若有函数max(a,b),并且已使函数指针变量P指向函数max,当调用该函数时,正确的调用方法是_____。
a. (*p)max(a,b);
b. *pmax(a,b);
c. (*p)(a,b);
d. *p(a,b);
(487) 已有函数则x(a,b),为了让函数指针变量P指向函数max,正确的赋值方法是_____。
a. p=max;
b. *p=max;
c. p=max(a,b);
d. *p=max(a,b);
(a)
(488) 若有以下说明和语句:
char *functions[]={"MSG","MP3","BOOK","GAME","TOOLS"};
char **q;
q = functions + 2;
则关于语句printf("%o\n",*q);说法正确的是_____.
a. 输出的是functions [2]元素的地址
b. 输出的是字符串MP3
c. 输出的是functions [2]元素的值,它是字符串MP3的首地址
d. 格式说明不正确,无法得到确定的输出
(489) 设有以下定义:
char *cc[2]={"1234","05678"};
则正确的叙述是_____。
a. cc数组的两个元素中各自存放了字符串'1234"和"5678"的首地址
b. cc数组的两个元素分别存放的是含有4个字符的-经字符致组的首地址
c. cc是指针变量,它指向含有两个数组元素的字符型-维数组
d. 况数组元素的值分别是"1234"和"5678"
(490) 有四组对指针变量进行操作的语句,以下不正确正确的选项是____。
a. int *p,*q; q=p;
int a,*p,*q;p=q=&a;
b. int a,*p,*q; q=&a;p=*q
int a=20,*p;*p=a;
c. int a=b=0,*p;p=&a;b=*p;
int a=20,*p,*q=&a;*p=*q;
d. int a=20,*p,*q=&a;p=q;
int p,*q;q=&p;
(491) 设有以下语句:
struct st
{
int n;
struct st ??next;
};
static struct st a[3]={5, &&a[1], 7, &&a[2], 9, '\0'}, *p;
则以下表达式的值为6的是_____。
a. p++→n b. p→n++ c. (*p).n++ d. ++p→n
(492) 设有说明int s[2]={0,1},*p=s; 则下列错误的语句是______。
a. s+=1;
b. p+=1;
c. *p++;
d. (*P)++;
(493) 下面关于指针的说法正确的是_____。
a. 指针变量同普通变量一样,使用之前不仅要定义说明, 而且必须赋予具体的值。
b. 变量的地址是由编译系统分配的,对用户完全透明,用户不知道变量的具体地址。
c. 允许把一个长整型数直接赋予指针变量。
d. 一个指针变量只能指向同类型的变量。
(494) 下面关于指针运算,说法正确的是_____。
a. 取地址运算符&是单目运算符,其结合性为自右至左,其功能是取变量的地址。
b. 取内容运算符*是单目运算符,其结合性为自右至左,用来表示指针变量所指的变量。
c. 指针变量的加减运算只能对数组指针变量进行, 对指向其它类型变量的指针变量作加减运算是毫无意义的。
d. 两个指针变量之间的运算只有指向同一数组的两个指针变量之间才能进行运算, 否则运算毫无意义。
(a.b.c.d)
(495) 下面关于指针的说法正确的是______。
a. 提高程序的编译效率和执行速度。
b. 通过指针可使用主调函数和被调函数之间共享变量或数据结构,便于实现双向数据通讯。
c. 可以实现动态的存储分配。
d. 便于表示各种数据结构,编写高质量的程序。
(496) 说明下面指针的意义_____。
int *p[n];
int (*p)[n];
int *p();
int (*p)();
int **p;
(497) 给出以下定义,则正确的叙述为_____。
char x[]="abcdefg";
char y[]={'a','b','c','d','e','f','g'};
a. 数组X和数组Y等价 b. 数组x和数组Y的长度相同
c. 数组X的长度大于数组Y的长度 d. 数组X的长度小于数组Y的长度
(498) 设有如下定义:
int (*ptr)*();
则以下叙述中正确的是_____。
a. ptr是指向一维组数的指针变量
b. ptr是指向int型数据的指针变量
c. ptr是指向函数的指针,该函数返回一个int型数据
d. ptr是一个函数名,该函数的返回值是指向int型数据的指针
(499) 若程序中已包含头文件stdio.h,以下选项中,正确运用指针变量的程序段是_____。
a. int *i=NULL; b. float *f=NULL;
scanf("%d",i); *f=10.5;
c. char t='m', *c=&t; d. long *L;
*c=&t; L='\0';
(500) 以下不能正确定义二维数组的选项是_____。
a. int a[2][2]={{1},{2}}; b. inta[][2]={1,2,3,4};
c. int a[2][2]={{1},2,3}; d. int a[2][]={{1,2},{3,4}};
(501) 若有定义:int *p[3];,则以下叙述中正确的是_____。
a. 定义了一个基类型为int的指针变量p,该变量具有三个指针
b. 定义了一个指针数组p,该数组含有三个元素,每个元素都是基类型为int的指针
c. 定义了一个名为*p的整型数组,该数组含有三个int类型元素
d. 定义了一个可指向一维数组的指针变量p,所指一维数组应具有三个int类型元素
(502) 有以下程序:
main()
{
int a[3][3], *p, i;
p = &a[0][0];
for(i=0;i<9;i++) p[i]=i+1;
printf("%d \n", a[1][2]);
}
程序运行后的输出结果是:
a. 3 b. 6 c. 9 d. 2
(503) 以下数组定义中不正确的是_____。
a. int a[2][3];
b. int b[][3]={0,1,2,3};
c. int c[100][100]={0};
d. int d[3][]={{1,2},{1,2,3},{1,2,3,4}};
(504) 以下选项中,不能正确赋值的是_____。
a. char s1[10];s1="Ctest";
b. char s2[]={'C', 't', 'e', 's', 't'};
c. char s3[20]="Ctest";
d. char *s4="Ctest\n"
(505) 下面程序的运行结果是_____。
main()
{
static int a[][4]={{1,2,3},{4,5},{6},{0}};
int k;
for(k=0;k<=3;k++)
printf("%4d", a[k][k]);
}
(506) 以下不能对二维数组a进行正确初始化的语句是_____。
a. int a[2][3]={0};
b. int a[][3]={{1,2,3},{4,5,6}};
c. int a[2][4]={{1,2,3},{4,5}{6}};
d. int a[][3]={{1,0,1},{},{1,1}};
(507) 若有说明:int a[3][4] = {0};则下面正确的叙述是_____。
a. 只有元素a[0][0]可得到初值0
b. 此说明语句不正确:。
c. 数组a中各元素都可得到初值,但其值不一定为0。
d. 数组a中每个元素均可得到初值0
(508) 若有说明:int a[][4] = {0,0};则下面不正确的叙述是_____。
a. 数组a的每个元素都可得到初值0
b. 二维数组a的第一维大小为1
c. 因为二维数组0中第二维大小的值除以初值个数的商为1,故数组a行数为1
d. 只有元素a[0][0]和a[0][1]可得初值0,其余元素均得不到初值0
(509) 若有说明:int a[3][4];则数组a各元素_____。
a. 可在程序的运行阶段得到初值0
b. 可在程序的编译阶段得到初值0
c. 不能得到确定的初值
d. 可在程序的编译或运行阶段得初值0
(510) 以下各组选项中,均能正确定义二维实型数组a的选项是_____。
a. float a[3][4]; b. float a(3,4);
float a[][4]; float a[3][4];
float a[3][]={{1},{0}}; float a[][]={{0},{0}};
c. float a[3][4]; d. float a[3][4];
static float a[][4]={{0},{0}}; float a[3][];
auto float a[][4]={{0},{0},{0}}; float a[][4]
(511) 若二维数组a有m列,则计算任一元素a[i][j]在数组中位置的公式为____。(假设a[0][0]位于数组的第一个位置上)
a. i*m+j b. j*p+i c. i*m+j-1 d. i*m+j+1
(d)
(512) 对以下说明语句的正确理解是_____。
int a[10]={6,7,8,9,10};
a. 将5个初值依次赋给a[1]至a[5]
b. 将5个初值依次赋给a[0]至a[4]
c. 将5个初值依次赋给a[6]至a[10]
d. 因为数组长度与初值的个数不相同,所以此语句不正确
(513) 若有说明:int a[][3]={1,2,3,4,5,6,7};则a数组第一维的大小是____。
a. 2 b. 3 c. 4 d. 无确定值
(514) 若二维数组a有m列,则在a[i][j]前的元素个数为_____。
a. j*m+j b. i*m+j c. i*m+j d. i*m+j+1
(b)
(515) 定义如下变量和数组 。
int k;
int a[3][3] = {1,2,3,4,5,6,7,8,9};
则下面语句的输出结果是 _ 。
for (k=0;k<3;k++) printf ("%d",a[k][2-k]);
a. 3 5 7 b. 3 6 9 c. 1 5 9 d. 1 4 7
(516) 若有以下程序段:
......
int a[]={4,0,2,3,1};i,j,t;
for(i=1;i<5;i++)
{t=a[i];j=i-1;
while(j>=0&&t>a[j])
{a[j+1]=a[j];j--;}
......
则该程序段的功能是 _____。
a. 对数组a进行插入排序(升序)
b. 对数组a进行插入排序(降序)
c. 对数组a进行选择排序(升序)
d. 对数组a进行选择排序(降序)
(517) 以下正确的定义语句是____。
a. int a[1][4]={1,2,3,4,5};
b. float x[3][]={{1},{2},{3}};
c. long b[2][3]={{1},{1,2},{1,2,3}};
d. double y[][3]={0};
(518) 下面是对s的初始化,其中不正确的是_____。
a. char s[5]={"abc"} b. char s[5]={'a','b','c'};
c. char s[5]="" d. char s[5]="abcdef";
(519) 对两个数组a和6进行如下初始化:
char a[]="ABCDEF";
char b[]={'A','B','C','D','E','F'};
则以下叙述正确的是 _____。
a. a与b数组完全相同 b. a与b长度相同
c. a和b中都存放字符串 d. a数组比b数组长度长
(520) 有两个字符数组a、b,则以下正确的输入格式是_____。
a. gets(a,b); b. scanf("%s%s",a,b);
c. scanf("%s%s",&a,&b); d. gets("a"), gets("b");
(521) 有字符数组a[80]和b[80],则正确的输出形式是_____。
a. puts(a, b); b. printf("%s, %s, a[], b[]);
c. putchar(a, b); d. puts(a), puts(b);
(522) 下面程序段的运行结果是_____。
char a[7]="abcdef";
char b[4]="ABC";
strcpy(a,b);
printf ("%c", a[5]);
a. ' ' b. \O c. e d. f(其中一表示空格)
(523) 有下面的程序段:
char a[3],b[]="china";
a=b;
printf("%s", a);
运行结果是_____。
a. 运行后将输出Chin b. 运行后将输出C
c. 运行后将输出Chi d. 编译出错
(524) 下面程序段的运行结果是_____。
char c[]="\t\v\\\0will\n";
printf("%d", strlen(c));
a. 14 b. 3 c. 9 d. 字符串中有非法字符,输出值不确定
(525) 判断字符串s1是否大于字符串s2应当使用_____。
a. if (sl>s2) b. if (strcmp(s1,s2))
c. if (strcmp(s2,sl)>0) d. if (strcmp(s1,s2)>0)
(526) 下面描述正确的是____。
a. 两个字符串所包含的字符个数相同时,才能比较字符串
b. 字符个数多的字符串比字符个数少的字符串大
c. 字符串"STOP "与"sTOp"相等
d. 字符串"17hat"小于字符串" he"
(527) 下述对C语言字符数组的描述中错误的是____。
a. 字符数组可以存放字符串
b. 字符数组的字符串可以整体输入、输出
c. 可以在赋值语句中通过赋值运算符"="对字符数组整体赋值
d. 不可以用关系运算符对字符数组中的字符串进行比较
(528) 下面程序的功能是将字符串5中所有的字符c删除。请选择填空。
#include
main()
{
char s[80];
int i,j;
gets(s);
for(i=j=0;s[i]!='\0';i++)
if(s[i]!='c')
_________
puts(s);
}
a. s[j++]=s[i] b. s[++j]=s[i];
c. s[j]=s[i];j++; d. s[j]=s[i];
(529) 对于p有定义:char * (*p[10])();则p是_____。
a. p是指针变量 b. p是函数名
c. p是数组 d. 以上都不是
(530) 设变量定义为int s[ ]="hello\nworld\n";则数组s中有______个元素。
a. 12 b. 13 c. 14 d. 15
(531) 设变量定义为int a[2]={1,3}, *p=&a[0]+1;则*p的值是_____。
a. 2 b. 3 c. 4 d. &a[0]+1
(532) 下列程序段的输出结果是_____。
int *p, *q, k=1, j=10;
p=&j; q= &k; p=q; (*p)++;
printf("%d",*q);
a. 1 b. 2 c. 10 d. 11
(533) 下列程序段的输出结果是_____。
char *st[ ]={"abcd","efgh","ijkl","mnop"};
printf("%s", *(st+1)+1);
(534) 对于以下的变量定义,表达式______不符合C语言语法。
struct node
{
int len;
char *pk;
} x={2, "right"}, *p=&x;
a. p->pk b. *p.pk c. *p->pk d. *x.pk
(535) 类型定义:
char S[3]="AB"
char *P;
在执行了语句P=S之后,*(P+2)的值是_____。
a. 'B'
b. '\0'
c. 不确定
d. 以上答案均不正确
(536) 在C语言中,要存储一个8个字符的字符串,至少需要声明大小为____的一维字符数组。
a. 7 b. 8 c. 9 d. 10
(537) 若有以下说明语句:
int a[12]={1,2,3,4,5,6,7,8,9,10,11,12};
char c = 'a', d, g;
则数值为4的表达式是_____。
a. a[g-c] b. a[4] c. a['d'-'c'] d. a['d'-c]
(538) 以下能正确定义一维数组的选项是_____。
a. int num[]; b. #define N 100
int num[N];
c. int num[0..100]; d. int N=100;
int num[N];
(539) 以下程序的输出结果是_____。
main()
{
char a[] = "abcdefg", b[10] = "abcdefg";
printf("%d %d\n", sizeof(a), sizeof(b));
}
(540) 不能把字符串"Hello!"赋给数组b的语句是_______。
a. char b[10] = {'H','e','l','l','o','!','\0'};
b. char b[10]; b="Hello!";
c. char b[10]; strcpy(b,"Hello!");
d. char b[10] = "Hello!";
(b)
(541) 若有说明:int i, j=2, *p=&i;则能完成i=j赋值功能的语句是_____。
a. i=*p; b. p*=*&j; c. i=&j; d. i=**p;
(542) 以下定义语句中,错误的是________。
a. int a[] = {1,2}; b. char *a[3];
c. char s[10] = "test"; d. int n = 5,a[n];
(543) 若有以下定义和语句:
int s[4][5], (*ps)[5];
ps = s;
则对s数组元素的正确引用形式是:______。
a. ps+1 b. *(ps+3) c. ps[0][2] d. *(ps+1)+3
(544) 若有说明:int n=2, *p=&n, *q=p;则以下非法的赋值语句是______。
a. p=q; b. *p=*q; c. n=*q; d. p=n;
(545) 定义一维数组变量a的正确格式是_____。
a. int a(10); b.int n=10, a[n]; c. int a[ ]; d. #define SIZE 10
int a[SIZE];
(d)
(546) 若有以下说明和语句:int a[10], *p1, *p2; p1=a; p2=&a[5];则p2-p1的值为_____。
a. 5 b. 6 c. 10 d. 没有指针与指针的减法
(547) 设int a=12,则执行完语句a+=a-=a*a后,a的值是_____。
a. 522 b. 264
c. 144 d. -264
(548) 以下程序段的输出结果是_____。
int x=3;
do
{
printf("%3d",x-=2;
}
while (!(--x));
a. 1 b. 3 0
c. 1 -2 d. 死循环
(549) 下列说明不正确的是____。
a. char a[10] = "china";
b. char a[10], *p=a; p="china";
c. char *p; p="china";
d. char a[10], *p; p=a="china";
(550) 以下选项中,不能正确赋值的是_____。
a. char s1[10]; s1="Ctest";
b. char s2[] = {'C', 't', 'e', 's', 't'};
c. char s3[20] = "Ctest";
d. char *s4 = "Ctest\n";
(551) 设有如下定义:
char *aa[2]={"abcd","ABCD"};则以下说法中正确的是_____。
a. aa数组元素的值分别是"abcd","ABCD"
b. aa是指针变量,它指向含有两个数组元素的字符型一维数组
c. aa数组的两个元素分别存放的是含有4个字符的一维字符数组的首地址
d. aa数组的两个元素中各自存放了字符'a','A'的地址
(552) 下面说法正确的是_____。
a. 一个函数利用return只能返回一个函数值。
b. 用scanf输入字符时,字符串中不能包含空格。
c. 字符常量的长度肯定为1。
d. 不能在赋值语句中通过赋值运算符"="对字符型数组进行整体赋值。
(553) 下面正确的是_____。
a. 字符串指针变量本身是一个变量,用于存放字符串的首地址;
b. 可以对任何作用范围的字符串指针变量进行初始化,如:
static char st[]={"C Language"};
c. 字符数组作初始化赋值,必须采用外部类型或静态类型;
d. 字符数组char st[20]; st={"C Language"}; 是正确的赋值方法。
(554) 下面关于函数指针的表达式正确的是_____。
已知:
int (*pmax)();
int max(int a, int b)
a. pmax = max;
b. int z = (*pmax)(x,y);
c. pmax++;
d. int z = pmax(x,y);
(555) 以下程序的输出结果为_____。
main()
{
char *alpha[6] = {"ABCD","IJKL","MNOP","QRST","UVWX"};
char **p;
int i;
p=alpha;
for (i=0; i<4; i++)
{
printf("%s", p[i]);
}
printf("\n");
}
a. ABCDEFGHIJKL b. ABCD c. ABCDIJKLMNOPQRST d. AEIM
(556) 设有以下语句,不是对字符串的正确引用的是____,其中0≤k<4
char str[4][12] = {"aaa", "bbbb", "ccccc", "dddddd"}, *strp[4];
int i;
for (i=0; i<4; i++)
{
strp[i] = str[i];
}
a. strp b. str[k] c. strp[k] d. *strp
(557) 设有以下语句:
char str1[] = "string", str2[8], *str3, *str4="string";
则_____不是对库函数strcpy的正确调用,此库函数用于复制字符串。
a. strcpy(str1, "HELLO1"); b. strcpy(str2, "HELLO2");
c. strcpy(str3, "HELLO3"); d. strcpy(str4, "HELLO4");
(558) 若有语句int *point,a=4;和point =&a; 下面均代表地址的-组选项是_____。
a. a, pint, *&a
b. &*a, &a, *point
c. *&point, *point, &a
d. &a, &*point, point
(559) 下面程序段的运行结果是_____。
char s[6];
s = "abcd";
printf("\"%s\"\n", s);
a. "abcd"
b. "abcd "
c. \"abcd\"
d. 编译出错
(560) 若变量已正确定义,____不能使指针p成为空指针。
a. p=EOF b. p=0 c. p='' d. p=NULL
(a.c)
(561) 指针s所指字符串的长度为____。
char *s="\\"Name\\Address\n";
a.19 b.15 c.18 d.说明不合法
(562) 设有说明语句:char a= '\72abc';则变量a___。
a. 包含6个字符 b. 包含5个字符 c. 包含4个字符 d. 说明不合法
7.2 填空题
(563) 下面程序的输出结果为________。
char str[10];
char *pStr = str;
printf("%d,%d", sizeof(str), sizeof(pStr));
(564) 下面程序的输出结果是_____。
Union
{
T_S16 a;
T_S16 b;
}s[4], *p;
main()
{
T_S16 n = 1;
for (i = 0; i < 4; i++)
{
s[i].a = n;
s[i].b = s[i].a + 1;
n = n+2;
}
p = &s[0];
printf("%d,", p->a);
printf("%d", ++p->a);
}
(565) 以下程序的输出结果是_____。
# include
# include
main()
{
char str[12]={'s','t','r','i','n','g'};
printf("%d\n",strlen(str));
}
(566) 字符串"ab\n\\012\\\""的长度是______。
(567) 填空使下面程序段输出computer。
char c[]="It's a computer";
for(I=0;____;I++)
{
______________;
printf("%c", c[j]);
}
(568) 下面程序的运行结果是______。
#include
main()
{
int i=5;
char c[6] = "abcd";
do
{
c[i] = c[i-1];
}
while (--i>0);
puts(c);
}
(569) 下面程序的运行结果是_______。
#include
main()
{
int i, r;
char s1[80] = "Message";
char s2[80] = " Media";
for (i=r=0; s1[i]!='\0' && s2[i]!='\0'; i++)
{
if(s1[i]==s2[i]) i++;
else {r=s1[i]-s2[i];
break;
}
printf("%d", r);
}
(570) 设int a[3][4]={{1,3,5,7},{2,4,6,8}};则*(*a+1)的值为______。
(571) 请补充下面函数:
/***********************************************/
/* *string_copy()函数:复制一个字符串
/* 形参:字符指针str_from接收源串,字符指针 str_to存储目标串
/* 返回值:无
/***********************************************/
void string_copy(char *str_from, char *str_to)
{
for(int i=0; !='\0'; i++);
}
main()
{
char array_str1[20] = "Hello.";
char array_str2[20];
string_copy(array_str1, array_str2);
printf("array_str2=%s\n", array_str2);
}
(572) 请补充下面函数:
/***********************************************/
/* sort()函数:对字符指针数组进行排序
/* 形参:name--字符指针数组,count--元素个数
/* 返回值:无
/***********************************************/
void sort(char *name[], int count)
{
char *temp_p;
int i,j,min;
// 使用选择法排序
for(i=0; i {
min=i;
for(j=i+1; j {
if (______ > 0)
{
min=j;
}
}
if(min!=i)
{
temp_p=name[i];
name[i]=name[min];
name[min]=temp_p;
}
}
}
(573) 下面程序的运行结果是____。
#include "stdlib.h"
fun(int **a,int p[2][3])
{
**a = p[1][1];
}
main()
{
int x[2][3] = {2,4,6,8,10,12};
int *p;
p = (int *)malloc(sizeof(int));
fun(&p, x);
printf("%d\n", *p);
}
(574) 以下程序的运行结果是_____。
#include
main()
{
int i,k;
for (i=0; i<4; i++)
{
k = sub(&i);
printf("%3d", k);
}
printf("\n");
}
sub(int *s)
{
static int t=0;
t=*s+t;
}
(575) 下面程序段是把从终端法入的一行字符作为字符串放在字符数组中,然后输出。请填空。
int i;
char s[80],*p;
for(i=0; i<79; i++)
{
s[i] = getchar();
if(s[i] == '\n') break;
}
s[i] = ____;
p = _____;
while (*p) pubchar(*p++);
(576) 下面程序段的运行结果是____。
char s1 = "AbcdEf";
char s2 = "aB";
s1++;
t = (strcmp(s1,s2) > 0);
printf("%d\n", t);
(577) 若有以下定义和语句:
int s[2][3]={0};
int (*p)[3];
p = s;
则p+1表示数组____。
(578) 若有定义:int a[2][3]={2,4,6,8,10,12}; 则a[1][0]的值是____, *(*(a+1)+0))的值是_______。
(579) 若有以下定义和语句:
int a[4]=(0,1,2,3), *p;
p = &a[2];
则*--p的值是_____。
(580) 设main函数的说明为:main(int argc,char *argv[]),且有命令行为:
FILEl 1 2 3<CR>(<CR>代表回车符=)
则argc的值是____,argv[1]的值是____。
(581) 有如下语句将a存入变量p中,请在横线上填空:
int *a[1];
int x;
x = 3;
a[0] = &x;
int _____ = a;
(582) 请在横线上填空:
定义语句int *f()在定义_____;
定义语句int (*f)();在定义____;
(583) 设main函数的说明为:main(int argc, char *argv[]),且有命令行为:
FILEl 1 2 3<CR>(<CR>代表回车符)
则argc的值是_____,
argv[1]的值是_____;
(584) 若以下main函数,经过编译、连接后得到的可执行文件名为file1.exe。且已知在系统的命令状态下输入命令行file MSG MP3<回车>后得到的输出是:MSG,请填空。
main(int argc,char *argv[])
{
while(____)
{
++argv;
printf("%s\n", _____);
--argc;
}
}
(585) 下面程序段的运行结果是_____:
char str[]="abc\0def\0ghi", *p=str;
printf("%s", p+5);
(586) 若有以下定义和语句:
int a[4] = (0,1,2,3);
int *p;
p = &a[2];
则*--p的值是______。
(587) 若有以下定义和语句;
int s[2][3] = {0};
int (*p)[3];
p = s;
则p+1表示数组_____。
(588) 若有以下定义和语句:
int a[4] = {0,1,2,3};
int *p;
p = &a[1];
则++(*p)的值是_____。
(589) 下面程序段的运行结果是____。
char a[] = "123456789";
int *p;
int i = 0;
p = a;
while (*p)
{
if (i%2 == 0)
{
*p = '*';
p++;
i++;
}
}
puts(a);
(590) 下面程序段的运行结果是_____。
char s[20] = "abcd";
char *sp = s;
sp++;
puts(strcat(sp, "ABCD"));
(591) 写出如下程序段的输出结果是____。
static int a[3][4] = {{1,3,5,7}, {9,11,13,15}, {17,19,21,23}};
printf("%d, %d, %d", *a[1], *(a[1]+2), *(*(a+2)+3)*2);
(592) 请仔细阅读函数f1,然后在函数f2中填入正确的内容,使函数f1和函数f2有相同的功能。
char *f1(char s[ ], char t[])
{
int k;
for(k=0; t[k]!=''; k++)
{
s[k] = t[k];
}
s[k] = '';
return s;
}
char *f2(char *s, char *t)
{
___________;
while ((______ = *t++) != '')
;
return s;
}
(593) 下列程序段的输出是_____。
int *p, *q, k=5, j=6;
q=&k; p=q; q=&j;
printf("%d", *p);
(594) 下列程序段的输出是_____。
char *a[2]={"one", "two"}, **p=a;
printf("%s,", *(p++)+1);
printf("%cn", **p-1);
(595) 若有以下定义语句:
char s[10], s = "abcd";
printf("%s\n", s);
则运行结果是__________。
(596) 若有以下程序段:
char str[] = "ab\n\012\\\"";
printf("%d", strlen(str));
该程序段的输出结果是_________。
(597) 下面程序的运行结果是___________。
main()
{
if ( "abc" == "abc" )
{
printf("The two are the same.\n");
}
else
{
printf("The two are not the same.\n");
}
}
(598) 请阅读下面的程序,在编译时出错的是_____行,编译通过但会在运行时出错的是________行。
1. main()
2. {
3. char *name;
4. char msq[10];
5. printf("What is your name?\n");
6. scanf("%s", &name);
7. msq = "Hello";
8. printf("%s %s \n", msq, name);
9.}
(599) 下面程序将打印____个字符串:
main()
{
static char fd[]="Yummy";
char *ptr;
ptr = fd + strlen(fd);
while (--ptr >= fd)
puts(ptr);
}
(600) 下面程序的运行结果是______
#include
#include
fun(char *s)
{
char a[7];
s=a;
strcpy(a,"look");
}
main()
{
char *p;
fun(p);
puts(p);
}
(601) 下列程序段的输出结果是_____。
char *st[ ] = {"abcd","efgh","ijkl","mnop"};
printf("%s", *(st+3)+2);
7.3 问答与设计
(602) 请分析下面代码,指出问题并改正:
T_S8 a[] = "hello";
a[0] = 'X';
cout << a << endl;
T_S8 *p = "world";
p[0] = 'X';
cout << p << endl;
(603) 请分析下面代码,指出问题并改正:
T_S8 a[] = "hello";
a[0] = 'X';
cout << a << endl;
T_S8 *p = "world";
p[0] = 'X';
cout << p << endl;
(604) 请给出下面代码的运算结果:
a. T_S8 a[] = "hello world";
T_S8 *p = a;
cout<< sizeof(a) << endl;
cout<< sizeof(p) << endl;
b. void Func(T_S8 a[100])
{
cout<< sizeof(a) << endl;
}
(605) 请指出下面代码的错误并改正。
const int SIZE = 10;
char a[SIZE];
(606) 请指出以下代码不合理的地方,并修正。
char * function(void)
{
char *p;
p = (char *)malloc(…);
if(p==NULL);
…;
… /* 一系列针对p的操作 */
return p;
}
main()
{
char *q = function();
…;
free(q);
}
(607) 指出下面描述二维浮点数数组输入的代码的错误。
# include "stdio.h"
main()
{
float a[2][3] ;
int i,j;
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)]
{
scanf("%f",&a[i][j]);
}
}
}
(608) 阅读下面程序指出错误并改正:
main()
{
int a[10];
int i,sum=0;
for(i=1;i<=10;i++)
{
scanf("%d",&a[i]);
}
for(i=1;i<=10;i++)
{
sum+=a[i];
}
printf("the sum is: %d\n",sum);
}
(609) 请说明函数指针的定义格式。
(610) 指出下面程序的错误并改正:
#include
char *strcut(char *s, int m, int n);
main(void)
{
static char s[] = "Good Mornint!";
char *strcut(), *ps;
ps = strcut(s, 3, 4);
return 0;
}
char *strcut(char *s, int m, int n)
{
char substr[20];
register int i;
for (i = 0; i < n; i++)
{
substr[i] = s[m+i-1];
}
substr[i] = '\0';
return substr;
}
(611) 指出下面程序的错误并改正:
char p1(char *s2)
void main(void)
{
char (*s1)(), ch;
s1 = p1();
ch = (*s1)("abcd");
printf("%c", ch);
}
char p1(char *s2)
{
return s2[1];
}
(612) 指出下面程序的错误并改正:
#include
void main(void)
{
char string1[10], string2[10];
scanf("%s", string1);
gets(string2);
printf("The string1 is %s\n", string1);
printf("The string2 is %s\n", string2);
}
(613) 指出下面程序的错误:
main()
{
static int a[10]={1,2,3,4,5,6,7,8,9,10};
printf("%d",a[10]);
}
(614) 指出下面程序的错误:
main()
{
int a[3]={0,1,2};
}
(615) 为什么不能对数组名进行运算?
(616) 可以把另外一个地址赋给一个数组名吗?
(617) 可以使用数组后面第一个元素的地址吗?
(618) 为什么要小心对待位于数组后面的那些元素的地址呢?
(619) 在把数组作为参数传递给函数时,可以通过sizeof运算符告诉函数数组的大小吗?
(620) 通过指针或带下标的数组名都可以访问数组中的元素,哪一种方式更好呢?
(621) 可以把另外一个地址赋给一个数组名吗?
(622) array_name和&array_name有什么不同?
(623) 为什么用const说明的常量不能用来定义一个数组的初始大小?
(624) 字符串和数组有什么不同?
(625) 请分别用下标法和指针法实现操作:先输入10个元素,再输出它们。
(626) 为什么不能用整型变量变量定义数组?
(627) 为什么数组必须用extern 或者 static 存储类来定义?
(628) 请设计一种实现动态数组的方案。
(629) 请指出下面语句的错误并修正:
char char_array[20];
char_array = "This is a example.";
(630) 指出下面程序的错误并改正:
#include
main(void)
{
char yz[6] = "abcdef";
printf("%s\n", yz);
return 0;
}
(631) 指出下面程序的错误并改正:
#include
main(void)
{
static char yz[6];
yz = "abcdef";
printf("%s\n", yz);
return 0;
}
(632) 指出下面程序的错误并改正:
#include
main(void)
{
int i, yz[10];
for (i = 1; i <= 10; i++)
{
ye[i] = i;
}
for (i = 1; i <= 10; i++)
{
printf("%d", yz[i]);
}
return 0;
}
(633) 指出下面程序的错误并改正:
#include
main(void)
{
static char yz[6] = "out of!";
printf("%s", yz);
return 0;
}
(634) 请指出下面程序的错误并改正:
# include "stdio.h"
struct student
{
float b[3];
int x;
}a[2];
main()
{
int i,j;
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
{
scanf("%f", &(a[i].b[j]));
}
}
}
(635) 指出下面程序错误的地方:
char str[10];
char *pStr = str;
str++;
pStr++;
(636) 什么是间接引用(indirection)?
(637) 什么是指针常量?
(638) 最多可以使用几层指针?
(639) 什么是空指针? 什么时候使用空指针?
(640) 为什么不能给空指针赋值? 什么是总线错误、内存错误和内存信息转储?
(641) NULL总是等于0吗?
(642) 什么是void指针?
(643) 什么时候使用void指针?
(644) 可以对void指针进行算术运算吗?
(645) 什么时候使用指向函数的指针?
(646) 怎样用指向函数的指针作函数的参数?
(647) 两个指针可以相加减吗?为什么?
(648) 把一个值加到一个指针上意味着什么?
(649) 怎样打印一个地址?
(650) 用指针作if语句的条件表达式意味著什么?
(651) 数组的大小可以在程序运行时定义吗?
(652) 下列程序的运行结果是什么?
#include
fun(T_S8 *w, T_S16 n)
{
T_S8 t, *s1, *s2;
S1 = w;
S2 = w+n-1;
While (s1)
{
t = *s1++;
*s1 = *s2--;
*s2 = t;
}
}
void main(void)
{
T_S8 *p;
P = "1234567";
Fun(p, strlen(p));
Puts(p);
}
(653) 对指向数组的指针变量进行算术运算和关系运算的含义是什么?
(654) 对于二维数组int array[3][4], 下列语句各表示什么意思:
a. array+i
b. *(array+i)
c. *(*(array+i))
d. *(*(array+i)+j)
(655) 指向由n个整型元素组成的一维数组的行指针变量如何定义?
(656) 由n个整型指针元素组成的一维数组如何定义?
(657) 指出下面程序的错误并改正:
#include
void main(void)
{
char *s;
scanf("%s", s);
printf("%s\n", s);
}
(658) 指出下面程序的错误并改正:
#include
void main(void)
{
int s1 = 10;
static int *s;
s = &s1;
printf("%s\n", s);
}
(659) 指出下面程序的错误并改正:
void main(void)
{
int *s;
*s = 100;
printf("%s\n", s);
*s = 200;
printf("%s\n", s);
}
(660) 指出下面程序的错误并改正:
#include
#include
main(void)
{
char *s;
s = malloc(10);
printf("%s\n", s);
free(s);
return 0;
}
(661) 指出下面程序的错误并改正:
#include
#include
void main(void)
{
char *s1, *s2;
if ((s1 = (char *)malloc(20)) == NULL
|| (s2 = (char *)malloc(20)) == NULL)
{
printf("out of memory");
exit(1);
}
s1 = "COMPUTER ONE!";
s2 = "COPUTER TWO!";
s1 = s2;
printf(s1);
printfP(s2);
free(s1);
free(s2);
}
(662) 指出下面程序的错误并改正:
#include
#include
main(void)
{
struct ADDRESS
{
char *name;
int age;
char *zipcode;
int telephone;
}*s;
s->age = 22;
scanf("%s", s->zipcode);
scanf("%s", s->name);
s->telephone = 254;
printf("%s%d%s%d", s->name, s->age, s->zipcode, s->telephone);
return 0;
}
(663) 指出下面程序的错误并改正:
#include
#include
void main(void)
{
register int i;
int *s1;
int *s2;
if ((s1 = (int *)malloc(10 * sizeof(int))) == NULL)
{
printf("out of memory\n");
exit(1);
}
s2 = s1;
for (i = 0; i < 10; i++)
{
*s1++ = i;
}
printf("The int number included in the point is %d\n", (--s1-s2+1)) / sizeof(int))
}
free(s1);
}
(664) 指出下面程序的缺陷:
struct T_Item
{
typenameSomeinfo;
T_Item * Next; // 下一个结构的指针。
}
int AddItem(T_Item * obj)
{
T_Item *Temp;
if (obj == NULL)
return 0;
Temp = head; // head为一全局变量,为队列的头指针。
while (Temp->Next != NULL)
{
Temp = Temp->Next;
}
Temp->Next = obj;
return 1;
}
(665) 指出下面程序的缺陷:
void Show(int **info, int x, int y) // 打印一个x*y的数组的内容
{
int i, j;
for (i=0; i{
for (j=0; j{
printf("%d ",info[i][j]);
}
}
printf("\n");
}
(666) 什么叫作指针?指针中存储的地址和这个地址中的值有何区别?
(667) 结构与数组的区别是什么?
(668) 为什么说指针的效率比数组要高?
(669) 串拷贝(strcpy)和内存拷贝(memcpy)有什么不同?
(670) 怎样删去字符串尾部的空格?
(671) 怎样删去字符串头部的空格?
(672) 怎样拷贝字符串的一部分?
(673) 怎样打印字符串的一部分?
(674) 怎样将字符串打印成指定长度?
(675) 怎样使字符串右对齐?
(676) 怎样将数字转换为字符串?
(677) 怎样将字符串转换为数字?
(678) 怎样判断两个字符串是否相同?
(679) 请指出下面程序的错误并修正:
static char *name;
...
scanf("%s", name);
(680) 请指出下面程序的错误:
#include
#define ANSWER "Grant"
main()
{
char try[40];
puts("Who is buried in Grant's tomb?");
gets(try);
while (try != ANSWER)
{
puts("No, that's wrong. Try again.");
gets(try);
}
puts("That's right!");
}
(681) 请说明下面函数的意图:
void fit(char *string, int size)
{
if (strlen(string) > size)
*(string + size) = '\0';
}
(682) 请指出下面程序的缺陷并完善:
#include
main()
{
static char name[80];
static char addon[]="? Good name!";
puts("what is your name?");
gets(name);
strcat(name, addon);
puts(name);
puts(addon);
}
(683) 实现函数:计算字符串长度。原型如下:
int strlen(const char string)
(684) 实现函数:字符串拷贝。原型如下:
char *strcpy(char *destination, const char *source)
(685) 实现函数:字符串拷贝。原型如下:
char *strcat(char *target,const char *source)
(686) 实现函数:判断两个字符串是否相等。原型如下:
int streql(char *str1,char *str2)
(687) 实现函数:在字符串中查找某个字符。原型如下:
char *strchr(const char *string,int letter)
(688) 实现函数:计算某个字符在字符串中出现的次数。原型如下:
int chrcnt(const char *string,int letter)
(689) 实现函数:判断两个字符串是否相等。原型如下:
int strcmp(const char *str1,const char *str2)
(690) 编写函数reverse(s),把字符串s颠倒过来。
(691) 编写一个程序,一次把一个输入行字符串颠倒过来。
(692) 编写一个程序,用于把较长的输入行"折"成短一些的两行或多行,折行的位置在输入的第n列之前的最后一个非空白字符之后。要保证程序具备一定的智能,能应付输入行很长以及在指定的列前没有空白符或制表符时的情况。
(693) 编写一个用于把C程序中所有注解都删除掉的程序。不要忘记处理好带引号的字符串与字符常量。在程序中注解不允许嵌套。
(694) 将二维数组c[3][4]转换成一维数组[12]。