【C 高阶】数组和指针笔试题精选

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));    
  • 解析
  1. &nums + 1 等价于 (size_t)&nums + 1 * sizeof(int[5]),此时 p 指向了数组 nums 的下一个地址。即假设 nums 的地址为 0x10000000,则 p 指向的地址为 0x10000014。
  2. nums + 1 等价于 (size_t)nums + 1 * sizeof(int),返回的 nums[1] 的地址。
  3. 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);
  • 解析
  1. p + 1 等价于 (size_t)p + 1 * sizeof(int),返回指针 p 所指地址偏移 4 个字节后的地址。
  2. (size_t)p + 1p 所指的地址值直接加一。
  3. (short*)p + 1 等价于 (size_t)(short*)p + 1 * sizeof(short),返回指针 p 所指地址向后偏移 2 个字节后的地址。
  4. (long*)p + 1 等价于 (size_t)(long*)p + 1 * sizeof(long),返回指针 p 所指地址向后偏移 8 个字节后的地址。
  • 输出结果
p = 0x0
p + 1 = 0x4
(size_t)p  + 1 = 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值