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
指针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
最初指向字节 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 + 2
是 0x02 + 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]);
完成。
#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
指针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
最初指向字节 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 + 2
是 0x02 + 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]);
完成。