微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

这行如何添加带有常量的数组?

如何解决这行如何添加带有常量的数组?

我正在查看 line 272代码8086tiny。有

// regs16 and reg8 point to F000:0,the start of memory-mapped registers. CS is initialised to F000
regs16 = (unsigned short *)(regs8 = mem + REGS_BASE);

REGS_BASE

#define RAM_SIZE 0x10FFF0
#define REGS_BASE 0xF0000

Line 158 & 159memregs8regs16 定义为

unsigned char mem[RAM_SIZE],*regs8;
unsigned short *regs16;

所以我的问题是:regs8 = mem + REGS_BASE 行有什么作用?如何添加一个数组(mem)和一个常量(REGS_BASE)?感谢您的帮助!

解决方法

数组名代表第一个元素地址。

unsigned char mem[RAM_SIZE];

mem 等于 &mem[0]

Becides:(n 是常数) mem[n] = *(mem + n)

mem + n 是一个地址,您可以将其分配给适当的指针。

,

这一行如何添加带有常量的数组?

C 标准说(复制自 ISO/IEC 9899:201x 委员会草案 — 2011 年 4 月 12 日 N1570):

除非它是 sizeof 运算符、_Alignof 运算符或 一元 & 运算符,或者是用于初始化数组的字符串文字,该表达式具有 类型“类型数组”被转换为一个类型为“指向类型的指针”的表达式,它指向 到数组对象的初始元素...

所以当使用一个数组,即 mem 时,在 mem + ... 形式的表达式中,mem 被转换为 指向数组第一个元素的指针强>.

此外,标准说:

当一个整数类型的表达式被添加到一个指针或从一个指针中减去时, 结果具有指针操作数的类型。如果指针操作数指向一个元素 一个数组对象,并且数组足够大,结果指向一个元素偏移量 原始元素使得结果和原始的下标的差异 数组元素等于整数表达式。换句话说,如果表达式 P 指向 数组对象的第 i 个元素,表达式 (P)+N(等价于 N+(P))和 (P)-N(其中 N 的值为 n)分别指向第 i+n 个和第 i-n 个元素 数组对象,前提是它们存在。

因此,将整数 N 添加到指向数组元素的指针将得到一个指向元素的指针,该指针指向原始指针指向的元素之后的 N 个位置。

就您而言,这意味着:

Pointer to first element (aka pointer to mem[0])
 |
 |       Integer
 |        |
/-\   /-------\

mem + REGS_BASE

\-------------/
       |
      Pointer to the REGS_BASE'th element (aka pointer to mem[REGS_BASE])

在您的代码中,此指针同时分配给 reg8 和 - 在转换后 - 分配给 reg16

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。