【发布时间】:2019-05-22 01:57:30
【问题描述】:
我遇到了一个问题,我必须编写一个接受两个参数的函数(都是指针,第一个指向数组的开头,第二个指向最后一个之后的内存位置数组元素)
函数必须从数组的第一个元素调用到中间的元素,然后从中间元素调用到末尾的元素,然后函数应该返回这两个元素中较大的值.
double max_element(double *p1, double *p2)
{
double from_first_to_middle = max_element(p1, (p1 + p2) / 2 + p1);
double from_middle_to_last = max_element((p1 + p2) / 2 + p1, p2);
if(from_first_to_middle > from_middle_to_last)
{
return from_first_to_middle;
}
else
{
return from_middle_to_last;
}
}
但是当我尝试运行这段代码时,它给了我错误
error: invalid operands to binary + (have ‘double *’ and ‘double *’)
然后我想我应该取消引用这些指针,因为我不能对它们指向的地址进行这些操作,但它仍然不起作用。
谁能帮忙?
谢谢!
【问题讨论】:
-
指针上唯一有效的算术运算是减法,因为它可能会给出偏移量。任何其他操作都是没有意义的(并且是不允许的 - 请参阅port70.net/~nsz/c/c11/n1570.html#6.5.6p2)。您可以改为使用
p1+(p2-p1)/2之类的操作,因为这里的第二个加法操作数将具有整数类型 (ptrdiff_t)。 -
能否请您重新制定您的规范和问题?不清楚你的意思是“函数必须从数组的第一个元素调用到中间的那个,然后从中间的元素到最后的那个,然后函数应该返回的值那两个更大的。”。另外,第二个指针指向数组中最后一个元素之后的东西?这对我来说听起来很危险。
-
@John:您通常必须使用此约定来简化算法,即
p1 == p2表示空,p1 + 1 == p2表示单个项目,因此p2 - p1产生 1 尽管p2指向数组外部.除非你取消引用它,否则它不是 UB。 -
@Groo 当然,如果没有取消引用,一切都很好。但是你怎么能确定 p2 在数组中的最后一个元素之后呢?我不会再深入这个了。这个问题需要重构。
-
不知道为什么这个问题被否决了。对我来说看起来不错。代码需要一些格式化。