1.【单选题】
int* p;
{
std::unique_ptr< int [] > ptr{ std::make unique<int []>(5)};
ptr[2] = 250;
p = ptr.get();
}
p[2] = ?
A 0 B 250 C 不确定
解析:这道题大括号里的变量执行完就被释放内存了,所以ptr智能指针的值被释放掉,p[2] 的值不确定。
2.【单选题】
int* p;
{
int* a = new int [5];
p = a;
a[2] = 250;
}
p[2]=?
A 0 B 250 C 不确定
解析:这道题和上一题的区别是,指针 a 变量在括号执行完被释放,但是它指向的从堆中申请的内存空间还在,所以 指针 p 还在, p [2] = 250。
3.【单选题】
std::shared ptr<int[]> a {new int[5]{1001,1002,1003,1004,1005}};
std::shared ptr<int[]> b {a};
std::shared ptr<int[]> c {b};
a.reset();
c.reset();
b.use_count() = ?
A 0 B 1 C 2
解析:这道题比较简单,a, b 和 c 共享智能指针,a 和 c 被释放了,那就剩下 b 了,选B。
4.【单选题】
char str[100] { “hello china!” };
str[5] = 0;
std::cout << str;
屏幕上显示的内容为:
A hello B hello china! C hello0china!
解析:这道题很多人会选择C,那就错了。str[5] = 0,刚好是空格为0(即空字符 \0
),但是在 C 和 C++ 中,字符串是以空字符 \0
结尾的字符数组。当你将一个字符数组作为字符串输出时,输出函数(会在遇到第一个空字符时停止输出,所以选A。
5.【单选题】
char str[100] {“hello中国”};
std::cout << strlen(str);
屏幕上显示的内容为:
A 9 B 7 C 10
解析:一个中文占两个字节,所以选A。
6.【单选题】
typedef struct Role
{
int hp;
int mp;
}*PROLE;
PROLE pRole = new Role{250,350};
int a = (int) pRole,
a = a+4;
int* b = (int*)a;
(*b) += 500;
pRole->hp = ? pRole-> mp = ?
A250,350 B750,350 C250,850
解析:这道题考察的是 变量在结构体中是如何存储的,其中 a 指向结构体的地址,然后向右移动了四个字节,又指向了 mp,之后mp的值加 500,所以选C。
7.【单选题】
typedef struct Role
{
short id;
int hp;
int mp;
}*PROLE;
typedef struct Monster
{
char id;
int hp;
int mp;
};
sizeof(Role) = 12;
sizeof(Monster) = ?
A 12 B 9 C 11
解析:这道题考察结构体中变量的存储存在内存对齐的形式。char 和 short 一样都占 4
个字节,所以选A。
8.【单选题】
typedef struct Role
{
short id;
int hp;
int mp;
}*PROLE;
PROLE pRole = new Role{250,350};
int a = (int)pRole,
a = a + 4;
int* b = (int*)a;
(*b) += 500;
假设sizeof(Role) = 12 pRole->hp = ? pRole->mp = ?
A250,350 B750,350 C250,850
解析:这道题和第六道题类似,只要确定了 short 也占用 4 个字节,那么 指针 b 的地址就指向 hp,所以选B。