K&R C中int与double数组相加的代码理解及移植疑问
关于GraphicsGems中Roots3And4.c第231行代码的解释
在C语言中,数组名与整数相加是指针算术操作,既不是给数组元素加整数,也不会扩展数组。以下是具体拆解:
核心逻辑细节
- 数组名的隐式转换:数组名
s在表达式中会自动转换为指向数组第一个元素的指针,类型为double *。 - 指针偏移计算:
s + num表示从s指向的起始位置,向后偏移num个double类型的元素,最终得到一个新的double *指针,指向数组s中第num个元素的位置(数组下标从0开始,对应s[num]的内存地址)。 - 结合代码的实际作用:
SolveQuadric是求解二次方程的函数,K&R风格声明下,它的第二个参数是用于存储方程根的double *指针。- 传入
s + num的目的是让SolveQuadric将求解得到的根,从数组s的第num个位置开始写入,避免覆盖之前已经找到的根(这些根存在s[0]到s[num-1]中)。 SolveQuadric的返回值是本次求解得到的根的数量,num += 返回值的作用是将新找到的根的数量累加到num中,更新已找到的总根数。
示例辅助理解
假设初始时num=2,意味着数组s的前2个元素s[0]、s[1]已经存储了之前找到的根。此时s + num指向s[2],调用SolveQuadric后如果返回1,说明找到1个新根,这个根会被存在s[2]中,同时num会更新为2+1=3,表示现在总共有3个根存在数组s里。
内容的提问来源于stack exchange,提问作者user3508619
相关产品推荐
相关产品推荐

