#include <stdio.h>
int main(void)
{
char *cp;
short *sp;
int *ip;
short x[6];
int i, y;
y = 0x0102;
for (i = 0; i < 6; i++)
{
x[i] = y;
y = y + 0x1010;
}
cp = (char*) x;
printf("1) *cp = %x\n", *cp);
sp = x;
printf("2) *sp = %x\n", *sp);
printf("3) cp[3] = %x\n", cp[3]);
ip = (int*) x;
ip = ip + 1;
printf("A) *ip = %x\n", *ip);
printf("B) cp[6] = %x\n", cp[6]);
sp = sp + 5;
printf("C) *sp = %x\n", *sp);
*x = *cp + 2;
printf("D) cp[1] = %x\n", cp[1]);
return 0;
}
我不明白短数组如何被类型化为char,以及当类型转换发生时会发生什么。有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
您声明了一个名为short
的6个元素的x
数组。
您为每个元素分配了值。初始值为:
+------+--------+
| x[0] | 0x0102 |
+------+--------+
| x[1] | 0x1112 |
+------+--------+
| x[2] | 0x2122 |
+------+--------+
| x[3] | 0x3132 |
+------+--------+
| x[4] | 0x4142 |
+------+--------+
| x[5] | 0x5152 |
+------+--------+
我在这里做了一些假设,但如果不是你的情况就修改它们。
sizeof(char) = 1 bytes
sizeof(short) = 2 bytes
sizeof(int) = 4 bytes
Endianness = little endian
所以在内存中,它看起来像
+----+----+----+----+----+----+----+----+----+----+----+----+
| 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
+----+----+----+----+----+----+----+----+----+----+----+----+
| 51 | 52 | 41 | 42 | 31 | 32 | 21 | 22 | 11 | 12 | 01 | 02 |
+----+----+----+----+----+----+----+----+----+----+----+----+
| x[5] | x[4] | x[3] | x[2] | x[1] | x[0] |
+---------+---------+---------+---------+---------+---------+
其中
x
您转换x
的基址并将其分配给char
指针cp
。 printf()
会在*x
中看到一个大小为1
字节的字符。
x
指向字节0,cp
也是如此,但在后者的情况下,只有1
字节被视为sizeof(char)
是1
。
字节0的内容恰好是0x02
。
所以,
cp = (char*) x;
printf("1) *cp = %x\n", *cp);
打印2
。
sp
是short
指针,类型与x
相同。因此*sp
会打印与*x
相同的内容。它将考虑给定地址的第一个2
字节。 sp
指向字节0
。因此,将考虑字节0
和1
。因此,值为0x0102
,由
sp = x;
printf("2) *sp = %x\n", *sp);
cp
仍然指向字节0
。 cp[3]
实际上是*(cp+3)
。由于cp
是char
指针,cp+3
将指向0 + 3*sizeof(char)
0 + 3*1
,而3
又是字节3
。
在字节0x11
,我们有sizeof(char)
,只有一个字节被视为1
printf("3) cp[3] = %x\n", cp[3]);
。
所以,
11
将打印ip = (int*) x;
ip = ip + 1;
printf("A) *ip = %x\n", *ip);
在
ip
为整数指针x
分配基地址ip
。
然后1
增加ip
。 ip+1
最初指向字节0.由于0 + 1*sizeof(int)
将指向0 + 1*4
字节ip
,而31322122
又是字节4。
所以cp[6]
现在指向字节4.因为它是一个整数指针,所以考虑4个字节 - 即字节4,5,6和6。 7的内容为*(cp+6)
。
cp+6
表示32
。 32
指向字节6,其内容为sp = sp + 5;
printf("C) *sp = %x\n", *sp);
。
因此,
printf(&#34; B)cp [6] =%x \ n&#34;,cp [6]);
打印sp
。
5
向0 + 5*sizeof(short)
添加0 + 5*2
后,<{1}}现在指向5152
字节*x = *cp + 2;
,而*cp
又是字节10,其内容在考虑2个字节后(字节) 10&amp; 11)是0x02
。
*cp + 2
0x02 + 0x02
的值为0x04
。
0x0004
*x
= 0x04
= 0x00
此值分配给cp[1]
指向的整数(字节0和1)。
所以字节0现在是*(cp+1)
,字节1现在是cp+1
。
0x00
是printf("D) cp[1] = %x\n", cp[1]);
。 render
指向字节1,内容现在是res.locals
,在
app.locals
完成了。