C语言数组指针运算理解及跨语言代码转换疑问
关于C代码转Java/C#时数组声明与指针运算的疑问解答
我来帮你把这两个疑问拆解清楚,毕竟从C转到Java/C#,指针和数组的差异确实容易让人困惑:
疑问1:数组声明中的120 + 40是普通算术运算吗?
完全正确!在C语言中,int16_t arr_tmpShort[120 + 40];这条语句的作用就是创建一个包含160个int16_t类型元素的数组。这里的+就是普通的整数加法运算,编译器会在编译阶段就把120 + 40计算成常量160,作为数组的固定大小(只要这个表达式是编译时可确定的常量就行,这里显然满足)。
疑问2:指针运算的含义及与Java/C#数组操作的区别
先明确一个C语言的核心规则:数组名在大多数场景下会隐式转换成指向数组第一个元素的指针,也就是说arr_tmpShort等价于&arr_tmpShort[0](取数组第一个元素的地址)。
关于arr_tmpShort + 84的含义
它完全不等价于Java/C#中的arr_tmpShort[84]:
- 在Java/C#中,
arr_tmpShort[84]是直接取出数组索引为84的元素的值; - 在C语言中,
arr_tmpShort + 84是指针加法运算:指针会按照int16_t的大小(2字节)向后偏移84个元素的位置,最终得到的是指向arr_tmpShort[84]这个元素的指针(即&arr_tmpShort[84]),本质是一个内存地址,而不是元素的值。
关于ptr0 = arr_tmpShort + 84 - offset的含义
这个语句的逻辑是指针的偏移计算,不是对元素值做减法:
- 先计算
arr_tmpShort + 84,得到指向arr_tmpShort[84]的指针; - 再减去
offset(这里是5),相当于把指针向前偏移5个int16_t元素的位置; - 最终
ptr0指向的是arr_tmpShort[84 - offset](也就是arr_tmpShort[79])的内存地址。
简单说:这是取数组中索引为84 - offset的元素的地址,而不是取arr_tmpShort[84]的值再减去offset。
对应Java/C#的实现方式
因为Java和C#没有指针,所以直接用数组索引来模拟原C代码的逻辑即可:
Java版本
static void someFunction() { // int16_t对应Java的short类型 short[] arrTmpShort = new short[120 + 40]; int offset = 5; // 模拟原指针指向的元素索引 int ptr0Index = 84 - offset; // 对应原ptr0指向的元素索引 int ptr1Index = 85; // 对应原ptr1指向的元素索引 // 如果需要访问对应元素,直接用索引取值 // short value0 = arrTmpShort[ptr0Index]; // short value1 = arrTmpShort[ptr1Index]; }
C#版本
static void SomeFunction() { // int16_t对应C#的short类型 short[] arrTmpShort = new short[120 + 40]; int offset = 5; // 模拟原指针指向的元素索引 int ptr0Index = 84 - offset; int ptr1Index = 85; // 访问元素示例 // short value0 = arrTmpShort[ptr0Index]; // short value1 = arrTmpShort[ptr1Index]; }
内容的提问来源于stack exchange,提问作者VC.One
相关产品推荐
相关产品推荐

