C 指针转换

C Pointer Casting

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

您声明了一个包含 6 个元素的 short 数组,名为 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]    |
+---------+---------+---------+---------+---------+---------+

其中

  • 第一行:字节数(仅用于识别目的 这里)
  • 第2行:内存中的十六进制内容(十六进制中每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.

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

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

cp 仍然指向字节 0cp[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 递增 1ip 最初指向字节 0。因为 ip+1 将指向字节 0 + 1*sizeof(int),即 0 + 1*4,而后者又是字节 4。

所以ip现在指向字节4。由于它是一个整数指针,所以认为是4个字节——即字节4、5、6和7,其内容是31322122


cp[6]表示*(cp+6)cp+6指向字节6,内容为32.

因此,

printf("B) cp[6] = %x\n", cp[6]);

打印 32.

sp = sp + 5;
printf("C) *sp = %x\n", *sp);

sp 添加 5 后,现在指向字节 0 + 5*sizeof(short)0 + 5*2 又是字节 10,考虑 2 个字节后的内容(字节 10 和 11)是 5152.

*x = *cp + 2;

*cp的值为0x02
*cp + 20x02 + 0x02 = 0x04 = 0x0004.
此值分配给 *x(字节 0 和 1)指向的整数。

所以字节 0 现在是 0x04,字节 1 现在是 0x00

cp[1]*(cp+1)cp+1 指向字节 1 内容现在是 0x00,当

时打印
printf("D) cp[1] = %x\n", cp[1]);

完成。