国家二级C语言机试(编译预处理和指针)模拟试卷12
选择题
1.设有定义: int x=0,*p;紧接着的赋值语句正确的是(B)
A. *p=NULL;
B. p=NULL;
C. p=x;
D. *p=x;
解析:定义指针变量时,必须将指针变量初始化为NULL(为空),否则,如果不赋给它地址,系统会随机给它分配一个地址。
2.以下叙述中错误的是(D)
A. 函数可以返回地址值
B. 改变函数形参的值,不会改变对应实参的值
C. 当在程序的开头包含头文件stdio.h时,可以给指针变量赋NULL
D. 可以给指针变量赋一个整数作为地址值
解析:指针变量的值只能是存储单元地址,而不能是一个整数,选项D的描述是错误,为待选答案。函数可以返回内存空间的地址,同时函数形参和实参分别占用不同的内存单元,改变形参的值不会改变对应实参的值,在头文件stdio.h中,NULL被定义为void型的指针。
3.设已有定义: float x;则以下对指针变量P进行定义且赋初值的语句中正确的是(B)
A. int*p=(float)x;
B. float*p=&x;
C. float p=&x;
D. float*p=1024;
解析:定义指针变量的一般形式为:类型名 *指针变量名1,*指针变量名2,……;。对一个指针变量赋值要通过求地址运算符(&)获得变量的地址值,然后把此地址值赋给指针变量。因而在选项A的表达式中,赋值号的左边表示定义了指针变量p,而右边表示求变量x的地址值。
4.有以下程序,程序运行后的输出结果是
main(){int m=1,n=2,*p=&m,*q=&n,*r;
r=p;p=q;q=r;
printf(\\(B)
A. 1,2,1,2
B. 1,2,2,1
C. 2,1,2,1
D. 2,1,1,2
解析:在主函数定义了3个整数指针变量p,q,r,并且使P指向m,q指向n,再执行“r=p;p=q;q=r;”这三条语句,使q指向m,p指向n,再输出变量“m,n,*p,*q”时,它们值分别为1,2,2,1。
5.下面选项中的程序段,没有编译错误的是(A)
A. char*sp,S[10];sp=\\
B. char*sp,s[10];s=\\
C. char str1[10]=\\
D. char mark[];mark=\\
解析:选项B中数组名为常量,不能赋值,选项C字符数组之间无法完成赋值操作,选项D和选项B相同,无法对数组进行赋值。
6.设有定义double a[10],*s=a;以下能够代表数组元素a[3]的是(D)
A. (*s)[3]
B. *s[3]
C. *s+3
D. *(s+3)
解析:语句*s=a,使用指针变量s指向一维数组a的首地址,所以*(s+3)表示的是引用数组a[3]。
7.有以下程序,执行后的输出结果是
main() {int a=1,b=3,c=5;
int*p1=&a,*p2=&b,*p=&c;
*p=*p1*(*p2);
printf(\\(B)
A. 2
B. 3
C. 1
D. 4
解析:程序使整型指针p1、p2、p3指向a、b、c值所存放的地址空间。然后再将指针变量*p1、*p2中的值的乘积赋给指针变量*p,即赋给变量c,输出c的值3。
8.若有定义语句: int a[2][3],*p[3];则以下语句中正确的是(A)
A. p[0]=&a[1][2]
B. ++(*p);
C. *p++;
D. *p+=1;
解析:定义语句“int a[2][3],*p[3];”定义了整型二维数组a[2][3]和指针数组p[3]。在C语言中,二维数组名也是一个存放地址常量的指针,其值为二维数组中第一行的地址。所以选项A中,把整型数组a[0]的指针赋给p[0]。
9.若有定义语句:int year=2009,*p=&year;以下不能使变量year中的值增至2010的语句是(C)
A. (*p)++;
B. ++(*p);
C. *p++;
D. *p+=1;
解析:由于自加运算符++的运算级高于间接运算*的运算级,所以选项A的表达式*p++不能使变量year中的值增至2010。
10.有以下程序
main(){ int a[5]={2,4,6,8,10},*p,**k;
p=a;
k=&p;
printf(\\(B)
A. 4 4
B. 2 4
C. 2 2
D. 4 6
解析:主函数中指针变量p指向数组a中下标为0的元素,k指向P,那么*(p++)的值为2,p指向数组中下标为1的元素,k指向P,所以**k的值为4。
11.以下叙述中正确的是(C)
A. 如果p是指针变量,则*p表示变量p的地址值
B. 如果p是指针变量,则&p是不合法的表达式
C. 在对指针进行加、减算术运算时,数字1表示1个存储单元的长度
D. 如果p是指针变量,则*p+1和*(p+1)的效果是一样的
解析:移动指针是对指针变量加上或减去一个–整数,或通过赋值运算,使指针变量指向相邻的存储单元。因此,只有当指针指向一串连续的存储单元时,指针的移动才有意义。当指针指向一串连续的存储单元时,可以对指针变量进行加上或减去一个整数的运算,也可以对指向同一串连续存储单元的两个指针进行相减的运算。除此之外,不可以对指针进行任何其他的算术运算。C语言提供了一个间接访问运算符(*),又称间址运算符,它是一个单目运算符,优先级比较高,高于普通的算术运算符,但是低于()运算符,因此*p+1和*(p+1)的含义是不一样。当指针变量中存放了一个确切的地址值时,就可以用“间接访问运算符,,通过指针来引用该地址的存储单元。
12.有以下程序(注:字符a的ASCII码值为97)
main(){char*s={\\(D)
A. abc
B. 7890
C. 979899
D. 789
解析:因为小写字符a,b,c的ASCII的值分别为97,98,99,而在do while循环语句中,每次对字符的ASCII的值取余数并输出,第一次循环输出7,第二次循环输出8,第三次循环输出9。
13.设有定义: char*c;以下选项中能够使c正确指向一个字符串的是(A)
A. char str[]=\\
B. scanf(\\
C. c=getchar():
D. *c=\\
解析:在题目的题干中定义了字符指针变量c。在选项A中,首先定义字符数组str,然后再把字符数组str的首地址赋给字符指针变量c。所以选项A是正确的。在选项D中,如果在定义字符指针c时,同时给c赋初值时,这样的表达式是正确的。而本题不是在定义指针c时,同时给c赋初值。
14.有以下程序
#include
main()
<本文档预览:3600字符,共8311字符,源文件无水印,下载后包含无答案版和有答案版,查看完整word版点下载