c - 将 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 部分的作用。有人可以解释我哪里出错了吗?
解决方案
给定一个指向m
数组中某个元素的指针,比如x
和一个整数r
,m += r
调整m
为指向r
之后的元素x
。
例如,如果m
指向a[3]
和r
是 5,则m += r
变为m
指向a[8]
。
在 where m
is a的情况下uint8_t *
,它必须指向以字节为单位的元素,并且以元素为单位推进m
指针r
以r
字节为单位推进。在m
指向更大类型的情况下,例如 when m
is int *
,m
按r
元素推进指针按r*s
字节推进,其中s
是每个元素中的字节数。
在许多 C 实现中,内存中的字节简单地从 0 开始连续编号(尽管并非所有字节都可以映射到虚拟地址空间中),并且指针用它指向的字节数表示。在这种情况下,要将指针增加 n 个字节,C 实现只需将 n 添加到其表示中。在具有更复杂内存模型的 C 实现中,C 实现执行所需的任何操作以生成指向正确位置的指针。
推荐阅读
- google-cloud-platform - Google Cloud Run 应用程序中的“正在关闭:Master”
- excel - 保存为 CSV 的宏会阻止宏工作
- javascript - TypeError:无法读取 null 的属性“play”,即使它在反应中不是 null
- python - 有没有办法在 python selenium 的数字输入上使用 send_keys?
- c# - CS1069:在命名空间中找不到类型名称“RegistryKey”
- c# - UWP ScrollViewer 滚动使用鼠标滚轮但不使用触摸
- python - 我可以在列表理解中的条件中使用“或”吗?
- flutter - 为什么 Flutter 不生成国际化文件?
- angular - 如何以编程方式更新 MatChipList?
- c# - LINQ 选择按数组索引分组和排序的前 1 个