目录
第一题(%m.nf的意思)
使用printf函数打印一个double类型的数据,要求:输出为10进制,输出左对齐30个字符,4位精度。以下哪个选项是正确的?
A %-30.4e
B %4.30e
C %-30.4f
D %-4.30f
%m.nf的形式
默认是右对齐,如果想要左对齐的话要加-号
30表示输出的字符占30个宽度,也就是m
输出精度,也就是小数点后面的数字,也就是n也就是4
C
第二题(const的修饰问题(常量指针和指针常量))
请找出下面程序中有哪些错误()
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在*的右边:指针常量
const int *p1中的const修饰的是int,在*的左边是一个常量指针
int const *p2中的const修饰的也是int,在*的左边,也是一个常量指针
按照我们上面的说法,所以操作6和7错误了!
C
第三题(写时拷贝)
下面叙述错误的是()
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的内容也会被更改
C. acX比acY多一个\0
然后szX和szY指向的都是同一个常量字符串。szX修改的话,其指针也会发生变化,但是szY的指针并没有发生变化,所指向的依旧是abc所以我们的scY并不会被修改
D
第四题(*和+=的优先级问题)
在头文件及上下文均正常的情况下,下列代码的运行结果是()
int a[] = {1, 2, 3, 4};
int *b = a;
*b += 2;
*(b + 2) = 2;
b++;
printf("%d,%d\n", *b, *(b + 2));
A 1,3
B 1,2
C 2,4
D 3,2
这里的*b+=2中的*的优先级是要高于+=的,也就是说会先对数组的首元素进行解引用,然后将a[0]的1+2变成3,将我们的数组a变成3,2,3,4
*(b+2)也就是先将b指针向右偏移两个int的大小,也就是指向我们a[3]的位置解引用,获取到数组的第三个元素,将我们的a[3]变成2
也就是我们当前的a数组就变成了3,2,2,4
b++就是将指针b偏移一个指针类型大小,也及时指向我们数组的第二个元素(上面的操作并没有影响我们b本身是指向第一个元素这一事实)
然后printf("%d,%d\n", *b, *(b + 2));就是将我们的b当前位置的元素,也就是第二个元素,也就是2打印,然后再向后偏移两个位置,也就是第四个位置的元素4打印出来。
C
第五题(指针的定义问题)
用变量a给出下面的定义:一个有10个指针的数组,该指针指向一个函数,该函数有一个整形参数并返回一个整型数()
A int *a[10];
B int (*a)[10];
C int (*a)(int);
D int (*a[10])(int);
A 选项因为[]的优先级高于*的优先级所以a先和[]进行结合,标志它是一个数组,数组里面存放的是int类型的指针,只一个指针数组
B 因为加了括号A先和*结合,指向的是一个int类型的数组,数组的大小为10个元素的数组指针
C a先和*相结合,表明a是一个指针,后面的(int),表示这是一个函数指针,函数指针指向一个函数,这个函数有一个int参数,函数的返回类型也是int
D 首先[]优先级高于*也就是a先和[]结合,这也就是一个数组再和*集合,表名它是一个指针,它是数组里面存放的是函数指针,分别指向一个函数,该函数的参数为int,返回值也为int
D
第六题(结构体的大小计算问题)
在32位cpu上选择缺省对齐的情况下,有如下结构体定义:
struct A{ unsigned a : 19; unsigned b : 11; unsigned c : 4; unsigned d : 29; char index; };
则sizeof(struct A)的值为()
A 9
B 12
C 16
D 20
首先a变量会开辟一个4字节空间(32位):保存19个位
因为我们这里是缺省对齐,所以b的11个放入第一个4字节空间放得下,就放入第一个4字节空间
c的话已经放不下第一个4字节空间了,就放入第二个四字节空间(32位)占据4个比特位
d的话由于第二个四字节空间仅仅剩下28个位了放不下,所以开辟第三个四字节(32位)空间放入,
char的话不同于上面的unsigned类型的,需要重新开辟空间,也就是第四个四字节空间
一共是4个四字节空间
C