指针面试题(2)

第1题

#include<stdio.h>
int main()
{
	int a[4] = {1,2,3,4};
	int *ptr=(int*)(&a + 1);//4
	int *ptr2=(int*)((int)a + 1);//2000000
	printf("%x,%x",ptr[-1],*ptr2);//%x 16进制的形式输出整数
	//&a+1跳过整个数组 ptr[-1] 向前移动4个字节  所以是4
	//(int)a+1 把a强制转换成整数再+1  这个时候就是实实在在的+1个字节
	//*ptr2 解引用 向后访问1个字节00 00 00 02 因为是小端存储模式
	//所以结果为 2000000
	return 0;
}

运行结果:

第2题 

#include<stdio.h>
int main()
{
	int a[3][2] = {(0,1),(2,3),(4,5) };
	int *p;
	p = a[0];
	printf("%d\n",p[0]);//1
	//逗号表达式 内存里面 1 3 5 0 0 0 a[0] a是数组名 数组名表示首元素地址
	//所以是第一行第一个元素,p[0]相当于*(p+0) 所以也是第一行第一个元素
	return 0;
}

运行结果:

第3题

 

#include<stdio.h>
int main()
{
	int a[5][5];
	int(*p)[4];
	p = a;
	printf("%p,%d\n",&p[4][2] - &a[4][2],&p[4][2] - &a[4][2]);
    //p[4][2] == *(*(p+4)+2)
	//两个指针相减等于两个指针之间的元素个数,如果a-b b>a 那么这个元素之间的个数就是负数
	return 0;
}
//-4
//10000000000000000000000000000100 - 原码
//11111111111111111111111111111011 - 反码
//11111111111111111111111111111100 - 补码
//1111 1111 1111 1111 1111 1111 1111 1100
// F     F    F    F    F   F     F    C

内存分布图: 

运行结果: 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

易点点心动

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

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

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

打赏作者

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

抵扣说明:

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

余额充值