1.关于地址和指针,以下叙述正确的是:
A.可以通过强制类型转换让char型指针指向double类型变量
B.函数指针p指向一个同类型的函数f的时候,必须写成p=&f
C.指针p指向一个数组f的时候,必须写成p=&f
D.一个指针变量p可以指向自身
答案:A 解析:函数指针p指向一个同类型的函数f的时候,可以写成p=f,而不能写成&f, B错误。函数名代表函数的入口地址,指针p指向一个数组f时,可以写成p=f,也可以写成&f,数组名f,可以代表数组的首地址,选项C错误。指针地址指向的是一个地址,是个常量,不能将地址指向另一个地址,选项D错误。char型根据转化原则可以转化为double类型,因此答案是A项。
2.对于函数声明 void fun(float array[],int *ptr);下列叙述正确的是:
A.调用函数时,array数组的元素和ptr都是按值传送
B.函数声明有语法错误,参数array缺少数组大小定义
C.调用函数时,array数组中将存储从实参中复制来的元素值
D.函数array,ptr都是指针变量
答案:D 解析:(float array[],int *ptr)均表示定义了2个指针变量,*array和ptr,数组名作为函数形参时可以看作指针,所以函数形参中int array[]其实相当于int *array。调用函数时,array元组的元素和ptr都是按地址传送的。答案为D选项
3.设有定义:int x=0,*p; 紧接着的赋值语句正确的是:
A.*p=NULL; B.p=NULL; C.p=x; D.*p=x;
答案:正确答案B 题目中定义指针变量p,指针变量的赋值只能赋予地址,决不能赋予任何其他数据,否则将引起错误。不允许把一个数赋予指针变量,被赋值的指针变量前不能再加“*”说明符。
4.若有说明语句:int *ptr[10];以下叙述正确的是:
A.ptr是一个具有10个指针元素的一维数组,每个元素都只能指向整型变量
B.ptr是指向整型变量的指针
C.ptr是一个指向具有10个整型元素的一维数组的指针
D.ptr是一个指向10个整型变量的函数指针
正确答案:A 解析:int *ptr[10]定义一个指针数组,数组的大小是10,数组中每个元素均是指向整型变量的指针,A正确。ptr是指针数组不是指针,B选项错误。定义指向具有10个整型元素的一维数组的指针格式为:int (*ptr)[10],C选项错误。D选项:函数指针是指向函数的指针,不会指向整型数组。
5.代码如下,则程序的运行结果是()
#include <stdio.h>
int main(){
char *s="120119110";
int n0,n1,n2,nn,i;
n0=n1=n2=nn=i=0;
do{
switch(s[i++])
{
default : nn++;
case '0': n0++;
case '1': n1++;
case '2': n2++;
}
}while(s[i]);
printf("n0=%d,n1=%d,n2=%d,nn=%d\n",n0,n1,n2,nn);
}
A. n0=3,n1=8,n2=9,nn=1
B.n0=2,n1=5,n2=1,nn=1
C.n0=2,n1=7,n2=10,nn=1
D.n0=4,n1=8,n2=9,nn=1
正确答案:A 解析:本题执行过程为,s[0]='1',匹配case '1',n1=1,n2=1; s[1]=2,匹配case '2',n2=2; s[2]='0',匹配case '0', n0=1, n1=2, n2=3;s[3]='1' ,匹配case '1',n1=3,n2=4……依次类推。大家需要明白switch case函数组合的格式如下:(题目当中正是因为缺少break导致当匹配到某一项的时候,程序无法终止继续执行匹配项的后面的语句,导致会有不相关的值加一的操作)
switch(表达式) {
case 值1: 语句1;
break;
case 值2: 语句2;
break;
case 值3: 语句3;
break;
default: 语句4;
break;
}