单选题
1 下面能正确进行字符串赋值操作的是
A: char s[5]={"ABCDE"};
B: char s[5]={ ′A′, ′B′, ′C′, ′D′, ′E′};
C: char *s;s="ABCDE";
D: char *s;char a; scanf("%s",&s);
正确答案C;
选项A)和B)定义的数组空间太小,至少应该为6个字符的长度才可以。选项D)中的指针 s未赋初值,所以指向―个不确定的地址,因而不能用 scanf输入数据到这一指针所指向的地址中。
2 已定义以下函数:
int fun(int *p){return *p;}
fun函数返回值是 ( )
A: 一个整数
B: 形参p的地址值
C: 形参p中存放的值
D: 不确定的值
正确答案为C。
3 已定义以下函数
fun(char *p2, char *p1)
{ while((*p2=*p1)!='\0'){p1++;p2++;}
}
A: 将p1所指字符串复制到p2所指内存空间
B: 将p1所指字符串的地址赋给指针p2
C: 对p1和p2两个指针所指字符串进行比较
D: 检查p1和p2两个指针所指字符串中是否有’\0’
正确答案为A。
while((*p2=*p1)!='\0')
有两个作用,一个是判断条件是否成立以决定是否再次进入循环,另一个作用是判定之前先完成*p2=*p1
操作,该操作的作用是把p1所指存储单元的字符送给p2所指存储单元中。该循环作用就是把p1所指字符串中的字符逐一地送到p2所指存储单元,直到p1所指单元内容为’\0’为止。
4 设有程序段
int k=10;
while(k=0) k=k-1;
则下面描述中正确的是( )。
A: while循环执行10次
B: 循环是无限循环
C: 循环体语句一次也不执行
D: 循环体语句执行一次
正确答案为C
C语言中没有逻辑变量,用0来表示假,非0表示真.赋值后k=0,那么条件为假,则跳出循环,即一次也不执行
5 下列描述中不正确的是( )。
A: 字符型数组中可以存放字符串
B: 可以对字符型数组进行整体输入、输出
C: 可以对整型数组进行整体输入、输出
D: 不能在赋值语句中通过赋值运算符"="对字符型数组进行整体赋值
正确答案为C.
C语言规定只能逐个引用数组元素,而不能一次引用整个数组。对于字符数组,可以将整个字符串一次输入或输出。所以,选项C)不正确。
6 有以下定义:
char x[ ]="abcdefg";
char y[ ]={‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’};
则正确的叙述为( )。
A: 数组x和数组y等价
B: 数组x和数组y的长度相同
C: 数组x的长度大于数组y的长度
D: 数组x的长度小余数组y的长度
正确答案为C.
在C语言中,字符串以’\0’作为结束符,因此数组x的长度为7+1=8,而数组y的长度等于7.
7 下面四个选项中,均是不合法的用户标识符的选项是( )。
A: A P_0 do
B: float la0 _A
C: b-a goto int
D: _123 temp int
正确答案为C
C语言规定的标识符只能由字母、数字和下划线三种字符组成,第一个字符必须为字母或下划线,并且不能使用C语言中的关键字作为标识符。选项C)中goto和int是关键字,b-a中的"-"不是组成标识符的三种字符之一,所以,均是不合法用户标识符的选项是C)。
8
结构,可选用的赋值语句是( )。
A: *p1=*p2;
B: p1=p2;
C: p1=*p2;
D: *p1=p2;
答案为B
题目要求是p1也指向b,也即p1同样有p1=&b的效果,则只需对指针p1赋值为p2即可。A的效果是:p1所指向的地址的内容变为p2所指向的地址内容,效果如同a=b;C的效果是将p1指向p2所指向的值所代表的地址,效果如同a=(int)(b);D的效果是将p1所指向地址内容改为p2,效果如同,a=&b
9 若有定义:int (*p)[4];
则标识符p____________。
A: 是一个指向整型变量的指针
B: 是一个指针数组名
C: 是一个指针,它指向一个含有四个整型元素的一维数组
D: 定义不合法
正确答案为C
本题中相当于定义了一个二维数组int p[][4],标识符p是一个指针,指向一个含有4个元素的一维数组。
10 已有定义int k=2,*ptrl,*ptr2;
且ptr1和ptr2均已指向变量k,下面不能正确执行的赋值语句是( )
A: k=*ptr1+*ptr2
B: ptr2=k
C: ptr1=ptr2
D: k=*ptr1*(*ptr2)
正确答案为B.
ptr2 是指针 , k 是int型变量
11 语句int(*prt)();
的含义是____________。
A: prt是一个指向一维数组的指针变量
B: prt是指向int型数据的指针变量
C: prt是指向函数的指针,该函数返回一个int型数据
D: prt是一个函数名,该函数的返回值是指向int型数据的指针
正确答案为C.
12 下面判断正确的是____________。
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”;
正确答案为C.
选项A) char * a;a="china"应改为chara;a=“china”;选项B) 应该将str[5]改为str[6];选项D) 表述方法错误,c,d两个数组定义时不能连续赋值。
13 若有语句int a[10]={0,1,2,3,4,5,6,7,8,9},*p=a;
则( )不是对a数组元素的正确引用(其中0≤i<10)。
A: p[i]
B: *(*(a+i))
C: a[p-a]
D: *(&a[i])
正确答案为B.
a[p-a] p=a,p-a=0,这里就是引用 a[0]B. *(&a[i]) &a[i]
表示取第i+1个元素的地址, *
地址,表示引用地址中的数据,这里就是引用a[i]C. p[i] p是指针,地址,可以用数组元素引用方式来引用数组元素。p[i]就是a[i]D. *(*(a+i))
a+i是第i+1个元素的地址,*(a+i)
是引用地址中的数据,是个整数,*
整数,是错误的引用方式,会引起程序异常。
判断题
1:函数指针所指向的是程序代码区。
正确
如果指针未初始化,数据区或者空区、任意区
2:int *p
;定义了一个指针变量p,其值是整型的。
错误
指针作为一种类型,在不同的系统中实现是不同的, 概念上就不是整形,只是在32位系统中指针是占2个字节(同int).
int *p
;定义了一个指针变量p,其存储的值是一个地址,在这个地址存储的值是整型的
3语句*--p
;执行之后p指向的内存单元被改变。
错误
前缀 – 优先级高于 *.
按规定,表达式中有前缀–时,要先执行减1再计算表达式的值。
所以 *--p
要分解为 2步。 求地址 p=p-1, 再取值 *p
。
p指向的内存单元 通常 在遇到分号后 改变。
填空
下面程序段是把从终端读入的一行字符作为字符串放在字符数组中,然后输出。请填空。
#include<stdio.h>
main( )
{
int i;
char s[80],*p;
for(i =0;i<79;i++)
{
s[i]=getchar( );
if(s[i]=='\n')
break;
}
s[i]= ;
p=s;
while(*p)
putchar(*p++);
}
答案为:s
由p=s.可知操作为赋值,故填s.