我目前注册了一个 CS107 类(class),该类(class)做出以下假设:
sizeof(int) == 4
sizeof(短) == 2
sizeof(char) == 1
- 大字节序
我的教授展示了以下代码:
int arr[5];
((short*)(((char*) (&arr[1])) + 8))[3] = 100;
下面是代表arr
的20个字节:
|....|....|....|....|....|
我的教授说 &arr[1]
点在这里,我同意这一点。
|....|....|....|....|....|
x
我现在明白了 (char*)
使指针成为 char 的宽度(1 字节)而不是 int 的宽度(4 字节)。
我不明白的是 + 8
,我的教授在这里说要点:
|....|....|....|....|....|
x
但是它不应该指向这里吗,因为它向前移动了 char 大小(1 字节)的 8 倍?
|....|....|....|....|....|
x
最佳答案
让我们一步一步来。您的表达式可以这样分解:
((short*)(((char*) (&arr[1])) + 8))[3]
-----------------------------------------------------
char *base = (char *) &arr[1];
char *base_plus_offset = base + 8;
short *cast_into_short = (short *) base_plus_offset;
cast_into_short[3] = 100;
base_plus_offset
指向数组中的字节位置 12
。 cast_into_short[3]
指的是位置 12 + sizeof(short) * 3
处的 short
值,在您的例子中是 18
。
关于c - cast 周围的指针算术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28567417/