C语言中数组使用二元+运算符的作用是什么?Dart移植时如何实现等价逻辑
C代码语义说明
C中数组名本身代表首元素的内存地址,parser->payload + i是指针偏移操作:
- 等价于取
payload数组下标为i的元素的地址,即&parser->payload[i] - 传给
handleDataValue函数的是从i位置开始的剩余数组片段的引用,函数内部可以直接读写原数组i及之后位置的元素,不会操作i之前的内容
Dart 等价实现
Dart的List<int>没有原生指针偏移能力,需要根据handleDataValue的功能选择对应实现:
场景1:handleDataValue仅读取片段数据,不修改原数组
直接截取子数组传递即可,若要避免拷贝开销可以使用范围视图:
parser.handleDataValue( extendedCodeLevel, code, numBytes, // 若要求参数为List类型,用sublist,会产生拷贝 parser.payload.sublist(i), // 若允许Iterable类型,用getRange,无拷贝开销 // parser.payload.getRange(i, parser.payload.length), parser.customData );
场景2:handleDataValue需要修改原数组的内容
需要调整handleDataValue的参数定义,新增偏移量参数:
- 修改方法定义,新增
payloadOffset参数:
void handleDataValue( int extendedCodeLevel, int code, int numBytes, List<int> payload, int payloadOffset, // 新增偏移参数 dynamic customData ) { // 方法内所有访问payload的位置都加上偏移量即可 // 示例:原C逻辑访问payload[0] => 改为 payload[payloadOffset] // 原C逻辑访问payload[n] => 改为 payload[payloadOffset + n] }
- 调用时传入原数组和偏移量:
parser.handleDataValue( extendedCodeLevel, code, numBytes, parser.payload, i, parser.customData );
内容的提问来源于stack exchange,提问作者xerotolerant
相关产品推荐
相关产品推荐

