C代码转C#时关于C数组初始化、指针操作及元素自增的疑问
问题1解答
- 该代码的作用是声明长度为
W的short类型数组ytop,并完成初始化。 - 并不是仅将第一个位置赋值为0:C语言规定,当数组初始化列表提供的元素数量少于数组总长度时,剩余未显式赋值的元素会被自动初始化为对应类型的零值(此处就是short类型的0),因此整个ytop数组的所有元素都会被初始化为0。
- 对应C#实现:因为C#中值类型数组
new创建时,所有元素默认就会被初始化为0,你写的int[] ytop = new int[W];已经完全等效,无需额外循环赋值。
问题2解答
- 首先要明确:C代码中的
head和tail不是数组变量,是struct item*类型的元素指针,指向queue数组中某一个元素的内存地址,这是你现有C#代码的核心错误点。++head不是递增数组索引,是让指针向后移动1个元素的内存偏移量,指向数组中的下一个元素。queue作为数组名在此处自动退化为指向数组首元素的指针,queue + MaxQueue是指针偏移计算结果,指向数组最后一个元素的下一个内存位置。C语言允许指向数组末尾后一位的指针存在,只要不对其解引用就不会出现越界异常,属于合法用法。
- 整行代码是环形队列的标准边界处理逻辑:将head指针后移一位后,如果已经超出了queue数组的边界,就把head重置为数组首地址,实现队列的环形复用。
- 对应C#实现:C#不建议直接使用指针操作数组,你可以用两个int类型的索引变量代替指针:
int head = 0, tail = 0; // 入队对应逻辑 queue[head] = new Item { sectorno = player.sector, sx1 = 0, sx2 = W - 1 }; head++; if(head >= MaxQueue) head = 0; // 出队对应逻辑 Item now = queue[tail]; tail++; if(tail >= MaxQueue) tail = 0;
问题3解答
- 该代码的作用是给
renderedsectors数组中,下标为now.sectorno的元素值加1,不是递增数组索引。 - 运算逻辑:C语言中
[]运算符优先级高于前缀++,因此会先定位到renderedsectors[now.sectorno]这个元素的内存位置,将该位置存储的值加1后,再存回同一个位置。 - 对应C#实现:写法和C完全一致,不需要修改。
内容的提问来源于stack exchange,提问作者Canox
相关产品推荐
相关产品推荐

