int t[ ] = { 0x0203, 0x4 };
char *p=t;
printf(" *p = %d; *(p+1) = %d ",*p,*(p+1));
为什么*(p + 1)总是返回2,无论t中的第二个元素是什么?
答案 0 :(得分:2)
您正在little endian计算机上运行此程序。这意味着您的int数组按以下顺序存储在内存中:
0x03 0x02 0x00 0x00(第一个整数) 0x04 0x00 0x00 0x00(第二个整数)
尝试在0到7之间打印出*(p+i)
p,它应验证这一点。
答案 1 :(得分:1)
*(p+1)
是指向第一个int的第二个字节的指针。
整数以小端格式存储在大多数机器上。
因此0x0203
存储为03 02 00 00
,这就是为什么你得到02
的回报。
答案 2 :(得分:1)
您会看到指针数学对不同大小的整数以及机器的字节顺序的影响。
在小端架构上(就像你正在使用的任何东西 - 可能是英特尔式处理器),值首先存储在具有最低有效字节的内存中。因此,当您声明一个64字节的整数值0x0202时,它会被存储在内存中:
0302 0000 0000 0000
通过让p指向与t相同的位置,* p现在是0x03。但是,对指针进行算术会使您的值增加您要求乘以对象大小的量。在你的情况下,t指向0x0203的开头并向它添加1实际上将其值增加1 次 int的大小,8,使其指向0x04。
在p的值中加1会使字符的大小增加1 次,使其指向内存中的下一个字节。这就是02占据的位置。
如果你想看到4,试试这个:
printf(" *p = %d; *(p+1) = %d ",*p,*(p+8));
如果这不起作用,你的机器或编译器都会使用32位整数,你应该看到04:
printf(" *p = %d; *(p+1) = %d ",*p,*(p+4));
答案 3 :(得分:0)
A char*
指向包含char
即8位的块,
int*
指向包含int
即32位的块。
现在,您的原始数组是int
,以块状方式存储在内存中:
t[0] = 0x 00 00 02 03
t[1] = 0x 00 00 00 04
-------------- ------ ------
| 03 | 02 | 00 | 00 | <----- stored as little endian
------- ------ ------ ------
^
&t[0],p (both point to this same address)
------- ------ ------ ------
| 04 | 00 | 00 | 00 |
------- ------ ------ ------
^
&t[1]
但char*
&amp;的指针算术不同int*
:
char*++
前进8位,因为它代表的数据类型(char
)是8位。
类似地,int*++
前进32位,因为它代表的数据类型(int
)是32位。
所以,在你的情况下,这就是 p,(p + 1)指向:
-------------- ------ ------
| 03 | 02 | 00 | 00 | <----- stored as little endian
------- ------ ------ ------
^ ^
p p+1
------- ------ ------ ------
| 04 | 00 | 00 | 00 |
------- ------ ------ ------
^
&t[1]