关于 指针 的一点问题

来源:百度知道 编辑:UC知道 时间:2024/06/10 20:16:52
#include<stdio.h>
void main()
{
short int tVal;
char iArr[10]={0,1,2,3,4,5,6,7,8,9};
short int *pVal = NULL;
pVal=(short int *)(iArr+2);
tVal=*pVal;
printf("%d\n",tVal);
}
为什么结果 是770呢?
请高手详细说说 其中 内情
分不多 全给了
高手们 进来了就 给说说吧
我 可是 18号 第一个提问的
呵呵 !~~~~

哎.简单的问题..
iArr+2
指向了2
由于short int两个字节,所以:
低位是2,高位是3即:
0000001100000010

2的9次方+2的8次方+2的1次方 = 770

#include<stdio.h>
void main()
{
short int tVal;
char iArr[10]={0,1,2,3,4,5,6,7,8,9};
short int *pVal = NULL;
pVal=(short int *)(iArr+2);
tVal=*pVal;
printf("%d\n",tVal);
}

我们可以再后面增加几个函数,看输出的结果分析
printf("%d\n",tVal);//结果是770
printf("%d\n",iArr+2);//结果是-58
printf("%x\n",iArr+2);//结果是ff6c
printf("%ld\n",iArr+2);//结果是54132678

分析的
因为iArr+2是数据第二个元素的地址,因此地址长度是大于short int 型数据,(short int *)(iArr+2)时,因为short int类型的长度不够,会溢出,所以,pVal不能正常指向iArr+2,而是指向另外一个地址
而这个地址以short int型来读取的值是770

tVal和pVal分别是short类型的变量和指针
而Intel CPU的对short双字节的存放是:高字节在后,低字节在前
所以,tVal=*pVal=0x02+(0x03<<8)=0x0302=770