c++指针和引用之高难度(一)习题讲解

1.【单选题】

int a { 5000 };

int* ptrA { &a };

a++;

*ptrA = ?

A 5000         B 5001         C 5002

解析:ptrA是指向变量a的内存地址,变量a++,解引用ptrA的值也会变化,结果为5001。

2.【单选题】

int a { 5000 };

char logo { 65 };

int* ptrA { &a };

char* ptrlogo { &logo };

int c = sizeof ( int* ) + sizeof ( char* );

假设当前程序的编译架构为x64,

c=??

A 64         B 16        C8

解析:在x64架构下,指针(无论是int*char*还是其他任何类型的指针)的大小通常都是64位(即8字节)。这是因为64位系统使用64位地址空间来寻址内存中的对象。所以选B。

3.【单选题】

int a[] {1001,1002,1003};

int* ptrA  { &a[0] };

*ptrA++;

int c = (*ptrA)++;

c=??

A1001         B1002         C1003

解析:这道题首先ptrA指向了1001的地址,然后*ptrA++,指针的加法等于加上数据类型的字节长度乘以数量,此时ptrA又指向的1002的地址。int c = (*ptrA)++,后置递增,c就等于1002,选B。

4.【单选题】

int a { 0x12345678 };

short* b { (short*)&a };

*b = 0xFF;

a = ?

A 0x123456FF         B 0xFF345678        C 0x123400FF

解析:这道题int占用4个字节,short占用2个字节,将b用强制类型转换为a的指针,然后对b重新赋值,会改变a的值,此时a的后两个字节将会被覆盖掉,也就是 5678 会被替换为 00FF,答案选C。

5.【单选题】

int        a { 0x12344241 };

char* b { (char*)&a };

*b++;

std:.cout << *b;

A A         B B         C 0x41

解析:char 占用一个字节,将 b 用类型转换指向 a的地址,此时 b 指向的就是 0x41的地址,*b++,地址会向前一位,此时指向0x42的地址,十进制为 66 ,对应ASCII表中B,所以选B。

6.【单选题】

int a[] { 1000,1001,1002 };

int *b{ &a[1] };

int** c { &b };

std::cout << &a [1];

此时屏幕输出了0050000,

*c++;

std::cout<<b;

输出什么?

A 1002         B 0050000         C 0050004         D 未知

解析:b指向了数组a【1】的地址,c是一个二级指针,指向的是b的地址,此时屏幕输出了0050000,说明 b 就等于 0x0050000,*c++ 就等于 c++ ,说明  c 就等于 b的地址 加 4,但是对 b 没有影响 ,此时 b 依然等于 0x0050000,选B。

7.【单选题】

const int a { 1000 };

const int b { 2000 };

const int* c { &a };

以下哪句代码将不能运行?

A c = &b;        B *c = 9000;        C c = (int*)0;

解析: const int* c { &a }; 说明 c 是一个常量指针, 指针指向可以改,指针指向的值不可以更改,所以选B。

8.【多选题】

int a { 1000 };

int b { 2000 };

int* const c { &a };

以下哪句代码将不能运行?

A c = &b;        B *c = 9000;        C c = (int*)0;

解析:int* const c { &a }; 说明 c 是一个指针常量,指针指向不可以改,指针指向的值可以更改,所以选 A 和 C。

9.【多选题】

int a { 1000 };

int b { 2000 };

const int* const c { &a };

以下哪句代码将不能运行?

A c = &b;        B *c = 9000;        C c = (int*)0;

解析:int* const c { &a }; 说明 const 即修饰指针,又修饰常量,所以 A, B 和 C都不能运行。

10.【单选题】

int a[] { 1000,1001,1002 };

int *b{ &a[1] };

int** c { &b };

std::cout << &a [1];

(*c)++;

std::cout<<b;

输出什么?

A 1002         B 0050000         C 0050000         D 未知

解析:这一题与 第七题的区别是 (*c)++ 不同,c 是一个二级指针,指向 指针 b 的地址,因为 *c  = b ,此时(*c) ++,可以等效于 b++ , 而 b 是 int 的类型的指针,所以会加 4,之前 b 等于 0050000,加 4 后等于 0050004,所以选C。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大卫的纯爱战士

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

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

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

打赏作者

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

抵扣说明:

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

余额充值