- 使用printf函数打印一个double类型的数据,要求:输出为10进制,输出左对齐30个字符,4位精度。以下哪个选项是正确的? (C)
A %-30.4e
B %4.30e
C %-30.4f
D %-4.30f
这里题目要是主要是该类型为一个double类型的数据,输出类型为10进制,左对齐30个字符以及控制4位精度。double类型说明类型为%f,%e为指数类型的输出。默认输出为右对齐,如果需要左对齐则需要加上负号,控制30个字节因此负号后面为30,4位精度表示.后面为4,因此选C
- 请找出下面程序中有哪些错误:C
int main()
{
int i=10;
int j=1;
const int *p1;//(1)
int const *p2=&i; //(2)
p2=&j;//(3)
int *const p3=&i;//(4)
*p3=20;//(5)
*p2=30;//(6)
p3=&j;//(7)
return 0;
}
A 1,2,3,4,5,6,7
B 1,3,5,6
C 6,7
D 3,5
常量指针:指针所指空间的值不能改变,不能通过指针解引用修改指针所指空间的值,但是指针的指向可以发生改变。
指针常量:指针本身是一个常量,指针的指向不能发生改变,但是指针所指空间的值可以发生改变,可以通过指针解引用改变指针所指空间的值。
区别:const关键字和*的相对位置来判断,如果const在*左边则是一个常量指针,如果const在*右边则是一个指针常量。
(6)中p2是一个常量指针,不能修改所指向的值,因此出错。
(7)中更改了p3指针,但是p3是一个指针常量,所指向不能发生变化,所以选择C
- 下面叙述错误的是(D)
char acX[]=”abc”;
char acY[]={‘a’,’b’,’c’};
char *szX=”abc”;
char *szY=”abc”;
A acX与acY的内容可以修改
B szX与szY指向同一个地址
C acX占用的内存空间比acY占用的大
D szX的内容修改后,szY的内容也会被更改
其中
A:acX和acY都是字符数组,内容都是可以修改的.
B:szX,szY所指向的都是常量指针,因此指向同一个地址
C:acX和acY的区别就是初始化方式不同,acX会自带一个 ,因此占4个字节比acY大
D:szX内容发生改变是其指针的指向发生了改变,不会影响常量字符串的内容,因此szY所指向的内容不变,因此选D
- 下列代码的运行结果是(C)
int a[]={1,2,3,4};
int *b=a;
*b+=2;
*(b+2)=2;
b++;
printf(“%d,%dn”,*b,*(b+2));
A 1,3
B 1,2
C 2,4
D 3,2
题中,指针b指向数组a首元素,*运算符优先级高于+=,因此*b+=2中,先对b解引用,让数组a第一个值变为3。*(b+2)=2语句中先将指针b向后移动2个字节,也就是让a数组第三个元素变为2,b++就是让b指向位置向后移动1,也就是指向第二个元素位置。因此打印结果为2,4,选C
- 下列关于C/C++的宏定义,不正确的是(B)
A 宏定义不检查参数正确性,会有安全隐患
B 宏定义的常量更容易理解,如果可以使用宏定义常量的话,要避免使用const常量
C 宏的嵌套定义过多会影响程序的可读性,而且很容易出错
D 相对于函数调用,宏定义可以提高程序的运行效率
B:尽量使用const常量,因为宏定义没有类型安全检查,在预处理阶段进行替换,因此无法进行调试
- 有以下定义:
int a[10];
char b[80];
函数声明为:
void sss(char[],int[]);
则正确的函数调用形式是(D)。
A sss(a,b);
B sss(char b[],int a[]);
C sss(b[],a[]);
D sss(b,a);
函数调用时如果参数是数组类型,传入数组名即数组地址即可。
- 用变量a给出下面的定义:一个有10个指针的数组,该指针指向一个函数,该函数有一个整形参数并返回一个整型数(D)
A int *a[10];
B int (*a)[10];
C int (*a)(int);
D int (*a[10])(int);
A:[]运算符优先级高于*因此a先和[]结合,所以a是一个数组,存放的是int类型的指针,指针数组
B:加了()后先和*结合,因此是一个指针,是一个数组指针
C:这是一个函数指针,有一个参数,参数类型是int。
D:这里a先和[]结合,是一个数组,再和*结合表示他数组里面存放的是指针,这个指针指向函数,因此是一个函数指针数组,并且传入参数是int类型,返回值也是int,因此选D
- 以下程序统计给定输入中每个大写字母的出现次数(不需要检查输入合法性,所有字母都为大写),则应在横线处填入的代码为(D)
void AlphabetCounting(char a[], int n) {
int count[26] = {}, i, kind = 10;
for (i = 0; i < n; ++i)
_________________;
for (i = 0; i < 26; ++i) {
printf("%c=%d", _____, _____);
}
}
A、++count[a[i]-‘Z’] ‘Z’-i count[‘Z’-i]
B、++count[‘A’-a[i]] ‘A’+i count[i]
C、++count[i] i count[i]
D、++count[‘Z’-a[i]] ‘Z’-i count[i]
这里的代码目的是要计算每个大写字母的出现次数,使用一个26个元素的整型数组来统计次数的,数组下标是每个大写字母的ASCLL码值减去最小大写字母的ASCLL码值,因此第一个空格处应该是count[‘Z’-a[i]] ,这样减出来的值是正的,A和B都有可能会出现数组下标为负的情况。C无法起到统计次数作用。
- 在32位cpu上选择缺省对齐的情况下,有如下结构体定义:
struct A{
unsigned a : 19;
unsigned b : 11;
unsigned c : 4;
unsigned d : 29;
char index;
};
则sizeof(struct A)的值为(C)
A 9
B 12
C 16
D 20
这里是以位段的形式进行定义的。unsigned类型会开辟4个字节空间,位段占用数据类型,如果前一个数据空间足够的话则会和前一个放在同一4个字节中,否则会开辟一个新的空间。因此这里a和b存放在4个字节中,c占4个比特位,放不进去,需要新开4个字节空间,d也放不进c的4个字节空间中,因此也需要重新开辟4个字节空间,最后index是char类型需要开辟一个字节空间,因此一共是13.最后根据内存对齐的原则,对齐数按照最大宽度也就是4,所以最终结果为16选择C
- 下面代码会输出(A)
int main(){
int a[4]={1,2,3,4};
int *ptr=(int*)(&a+1);
printf("%d",*(ptr-1));
}
A 4
B 1
C 2
D 3
这里&a+1是将指针偏移整个数组大小,因此整型指针ptr指向4的后一个位置。最后ptr-1将指针向前移动一个整型的大小也就是指向4的位置,所以解引用后打印的值为4,选择A



