C语言指针的实例体验

本文通过一道实验室面试题,探讨了C语言中指针、数组、强制类型转换以及运算符优先级和大小端序的概念。通过分析题目的解答,详细解释了指针如何指向数组元素,并展示了不同指针操作下的内存访问情况。
摘要由CSDN通过智能技术生成

引言
到了春季的三四月份,东区的各大实验室都开始陆续纳新。大多数的纳新试题都考到了C语言有关的知识,看到3G实验室的一道题,这让我想起当我面试实验室的时候的一道题,非常有趣,今天我来和大家分享一下这道题
#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;}
这道题涉及到了指针,数组,强制类型转换以及运算符的优先级和大端序小端序,主要是体会指针指向的特点。

在我电脑上输出的值是 4,0200 0000(2000000)
然后让我给大家详细的分析一下这道题;
a是一个具有4个整型变量的数组的名字, &a是数组的首地址。&a+1表示让指针指向下一个数据,于是a的指向了4的下一个地址,用此来初始化ptr1,所以part1的指向如下:


3131633928877076304965.JPG

在ptr1初始化的时候,令&a+1强制转换成整型指针,所以 ptr1[-1]相当于把ptr1往前挪一个整型大小,即4个字节,然后呢,


3232633928876693817205.JPG

所以呢,打印出的第一个数字是a[3]的内容,即4

第二部分

ptr2先将a组数转化成整形变量,然后加1然后再转化成整形指针,所以此时 ptr2的指向在


asf633928867105530290.JPG

然后因为整形为四个字节,所以此时指向的是a{0}的后三个字节和a[1]的第一个字节,具体如下图(在x86系统下的数据存储),


dfadsfasfasfdasdfasdff.JPG

因为x86系统是小端序,读取数据或存储数据的时候是最低位对应低地址,所以打印
0200 0000。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值