gpt4 book ai didi

C 指针转换

转载 作者:太空宇宙 更新时间:2023-11-04 08:01:45 25 4
gpt4 key购买 nike

#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 个名为 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个字符代表一个字节)
  • 第三行:索引数组 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 是一个指针,与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]);

完成。

关于C 指针转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46129656/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com