一道百度经典指针笔试题

百度经典指针笔试题

题目

求下面代码打印出的结果

#include<stdio.h>

int main()
{
	int a[4] = { 1, 2, 3, 4};
	
	int* ptr1 = (int*)(&a + 1);
	int* ptr2 = (int*)((int)a + 1);
	
	printf("%x, %x", ptr1[-1], *ptr2);
	return 0;
}

分析解答

首先创建了一个整形数组a并且对其初始化,a中存储的内容如下:
在这里插入图片描述
a在内存中的存储如下:
在这里插入图片描述
首先看ptr1[-1]:
经过 int* ptr1 = (int*)(&a + 1);的操作,我们可知首先取a的地址并且+1,因为a为数组,所以+1跳过整个数组得到4后一个字节的内容,然后再把指针ptr1强制类型转换为整形指针,再经过ptr[-1]=*(ptr1 - 1)操作后,因为ptr1已经被强转为整形指针所以-1指向前一个字节即为4

所以ptr1[-1]打印出来结果即为4

再看*ptr2:
经过int* ptr2 = (int*)((int)a + 1);的操作,我们首先知道此时的a为一个数组的地址是一个十六进制的数,而把地址强制类型转换为整形+1,就相当于地址+1,具体解释如下图:
在这里插入图片描述
故此*ptr2打印出的即是2000000

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值