C指针铸造

时间:2017-09-09 10:22:49

标签: c pointers typecasting-operator

#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,以及当类型转换发生时会发生什么。有人可以帮我解决这个问题吗?

1 个答案:

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

其中

  • 第1行:字节数(仅用于识别目的 这里)
  • 第二行:内存中的内容为十六进制(每个2个十六进制字符代表一个字节)
  • 第3行:索引 数组x

您转换x的基址并将其分配给char指针cpprintf()会在*x中看到一个大小为1字节的字符。

x指向字节0,cp也是如此,但在后者的情况下,只有1字节被视为sizeof(char)1

字节0的内容恰好是0x02

所以,

cp = (char*) x;
printf("1) *cp = %x\n", *cp);

打印2

spshort指针,类型与x相同。因此*sp会打印与*x相同的内容。它将考虑给定地址的第一个2字节。 sp指向字节0。因此,将考虑字节01。因此,值为0x0102,由

打印
sp = x;
printf("2) *sp = %x\n", *sp);

cp仍然指向字节0cp[3]实际上是*(cp+3)。由于cpchar指针,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增加ipip+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表示3232指向字节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

0x00printf("D) cp[1] = %x\n", cp[1]); render指向字节1,内容现在是res.locals,在

时打印
app.locals

完成了。

相关问题