c - cast 周围的指针算术

标签 c casting pointer-arithmetic

我目前注册了一个 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 指向数组中的字节位置 12cast_into_short[3] 指的是位置 12 + sizeof(short) * 3 处的 short 值,在您的例子中是 18

关于c - cast 周围的指针算术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28567417/

相关文章:

c++ - 将 int 转换为 char。没有存储正确的值

C 错误在只读闪存 NAND MTD0 上打开 O_RDWR

c - 即使包含 mongoose.h 也 undefined reference

swift - 将字符串转换为 double 给出 nil

c# - 动态转换问题

c++ - 指针编译器问题

c++ - 如何解决指针别名问题?

C分数算术

c - GTK+ 笔记本 - 无法打印当前标签文本

c - 检测文件是否包含整数以外的字符