首页 > 解决方案 > 将 int 添加到 uint8_t 指针到底有什么作用?

问题描述

我用 C 编写的代码不多,但我目前(尝试)将 C 项目移植到 Rust,但我不明白这是做什么的:

void example(const uint8_t *m, unsigned int r)
{
    m += r;
}

经过一番谷歌搜索,我认为它与m = m[r]. 但如果这是真的,m并且m[r]是两种不同的数据类型(对……?)。试图在 Rust 中复制它:

fn example(m: &mut [u8], r: u32) {
    m = m[r];
}

这给出了错误mismatched types: expected `&mut [u8]`, found `u8,这是有道理的。我要么做错了 Rust 部分,要么我没有完全理解 C 部分的作用。有人可以解释我哪里出错了吗?

标签: cpointersrust

解决方案


给定一个指向m数组中某个元素的指针,比如x和一个整数rm += r调整m为指向r之后的元素x

例如,如果m指向a[3]r是 5,则m += r变为m指向a[8]

在 where mis a的情况下uint8_t *,它必须指向以字节为单位的元素,并且以元素为单位推进m指针rr字节为单位推进。在m指向更大类型的情况下,例如 when mis int *mr元素推进指针按r*s字节推进,其中s是每个元素中的字节数。

在许多 C 实现中,内存中的字节简单地从 0 开始连续编号(尽管并非所有字节都可以映射到虚拟地址空间中),并且指针用它指向的字节数表示。在这种情况下,要将指针增加 n 个字节,C 实现只需将 n 添加到其表示中。在具有更复杂内存模型的 C 实现中,C 实现执行所需的任何操作以生成指向正确位置的指针。


推荐阅读