1. 前言
在 C/C++ 相关的岗位笔试中,数组和指针相关的知识点为高频考点,能够很好考察应聘者的 C/C++ 功底。因此,本文精选了数组与指针相关的笔试题,并解析解题思路,希望能够加强读者对数组和指针的理解。
在阅读本文前,强烈推荐先学习博文《【C 高阶】- 彻底理解数组与指针》,里面详细介绍了数组与指针之间的共性与关联。
2. 笔试题精选
第一题
以下程序输出的结果是?
int nums[5] = {
1, 2, 3, 4, 5};
int* p = (int*)(&nums + 1);
printf("*(nums + 1) = %d\n", *(nums + 1));
printf("*(p - 1) = %d\n", *(p - 1));
- 解析
&nums + 1
等价于(size_t)&nums + 1 * sizeof(int[5])
,此时p
指向了数组nums
的下一个地址。即假设nums
的地址为 0x10000000,则p
指向的地址为 0x10000014。nums + 1
等价于(size_t)nums + 1 * sizeof(int)
,返回的nums[1]
的地址。p - 1
等价于(size_t)p - 1 * sizeof(int)
,返回指针p
所指地址向前偏移 4 个字节后的地址。由于p
指向了数组nums
的下一个地址,因此p - 1
得到的是nums[4]
的地址。
- 输出结果
*(nums + 1) = 2
*(p - 1) = 5
第二题
以下程序输出的结果是?
int* p = NULL;
printf("p = %p\n", p);
printf("p + 1 = %p\n", p + 1);
printf("(size_t)p + 1 = %lu\n", (size_t)p + 1);
printf("(short*)p + 1 = %p\n", (short*)p + 1);
printf("(long*)p + 1 = %p\n", (long*)p + 1);
- 解析
p + 1
等价于(size_t)p + 1 * sizeof(int)
,返回指针p
所指地址偏移 4 个字节后的地址。(size_t)p + 1
为p
所指的地址值直接加一。(short*)p + 1
等价于(size_t)(short*)p + 1 * sizeof(short)
,返回指针p
所指地址向后偏移 2 个字节后的地址。(long*)p + 1
等价于(size_t)(long*)p + 1 * sizeof(long)
,返回指针p
所指地址向后偏移 8 个字节后的地址。
- 输出结果
p = 0x0
p + 1 = 0x4
(size_t)p + 1 =