c语言指针进阶--面试题

#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);
}

先自行思考一下,没有思路了再看下边的解释吧。

先补充知识点:

地址+1操作。如果地址类型不是int型,则加1是按照指针类型所占字节数进行加的操作;是int

就只加1。比如一个结构体变量大小是20个字节,这里的加1就加上了20。

小端存储和大端存储。数据的存储有两种方式一种是大端一种是小端。小端是低位字节存低地址高位字节存高地址;大端是低位字节存高地址高位字节存低地址。我拿整型数字来举例,int a=1;整型4个字节32位是00000000 00000000 00000000 00000001(从左向右字节是从高位到低位)换成16进制00 00 00 01。

a的存储按照小端存储就是01 00 00 00;按照大端存储就是00 00 00 01。而vs ×86就是小端存储。

int a[4] = { 1,2,3,4 };初始化如下

int* ptr1 = (int*)(&a + 1);

在之前讲过&数组名是代表数组地址的意思,数值上跟首元素的地址是一样的。

加1就指向了末端元素下一位置

最后再强制类型转换,送入ptr1。

int* ptr2 = (int*)((int)a + 1);

先把a强制类型转换为整型,加1就只是加1。

ptr2比首元素地址大1,对应整型数也改变。

printf("%x %x", ptr1[-1], *ptr2);

ptr1是整型数组,ptr1[-1]可以理解为,*(ptr-1)

即最后输出结果为 00000004和 02000000,而%x是按照有效数字打印,会从第一个不是0的数字开始打印。

你做对了吗?

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值