Int到char数组。它是如何工作的?

时间:2014-07-21 23:48:05

标签: c arrays pointers char int

int t[ ] = { 0x0203, 0x4 };
char *p=t;
printf(" *p = %d; *(p+1) = %d ",*p,*(p+1));

为什么*(p + 1)总是返回2,无论t中的第二个元素是什么?

4 个答案:

答案 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]