大端模式和小端模式

<span style="font-size:18px;"># include <stdio.h>

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

	return 0;
}</span>

运行结果:5  2000000


分析:这里需要注意的是&a是整个数组的首地址,a是数组首元素的首地址,其值相同,但是意义不同。

对于指针p+1,指针变量与一个整数相加减并不是用指针变量里的地址直接加减这个整数,这个整数的单位不是字节而是元素的个数。

知道了这些就好办了。

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

&a+1这下加的1跑到了a[5](虽然不存在),ptr1[-1]=*(ptr1-1),这下跑到了a[4],所以结果是5;

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

a是数组a的首元素的首地址。(int)a+1是元素a[0]的第二个字节的地址。由于是int型,所以占4个字节

大端模式:

a[0] a[1] a[2] a[3] 

1 2 3 4

0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x03 0x00 0x00 0x00 0x04 

在32位的x86系统下,是小端模式——认为第一个字节是最低位字节

在内存中存放为:

a[0] a[1]

0x01 00 00 00 0x02 00 00 00

所以读取为:0x02000000

答案为:2000000 


你可能感兴趣的:(c,大端模式,小端模式)