【笔试题】【day2】

目录

第一题(%m.nf的意思)

第二题(const的修饰问题(常量指针和指针常量)) 

第三题(写时拷贝) 

第四题(*和+=的优先级问题)

第五题(指针的定义问题)

第六题(结构体的大小计算问题) 


第一题(%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

第二题(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并不会被修改

第四题(*和+=的优先级问题)

在头文件及上下文均正常的情况下,下列代码的运行结果是() 

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打印出来。

第五题(指针的定义问题)

用变量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个四字节空间

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

桜キャンドル淵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值