为什么我的代码不起作用?
#include <stdio.h>
int main()
{
int test[] = { 3, 9, 7 };
printf("%d", find(test, 3));
return 0;
}
int find (int array[], int size)
{
int i, largest, where;
largest = array [0];
for (i=0; i<size; ++i) {
if (array[i]>largest) {
largest = array[i];
where = i;
}
}
return (int) *(&array+sizeof(int)*where);
}
我知道我可以替换:
return (int) *(&array+sizeof(int)*where);
使用:
return array[where];
但这不是练习的重点。
答案 0 :(得分:2)
指针算法不能像你想象的那样工作。你在寻找:
return *(array + where);
array
已经是一个指针,并且指针算术在添加时只是“做正确的事”。
由于函数签名中的int array[]
,您可能会感到困惑 - 这只是int *array
的合成糖。你真的有一个指针,而不是一个数组。
由于在其他答案中存在一些错误信息,我将在此处写一个更完整的解释。这个功能签名:
int find(int array[], int size)
真的意味着:
int find(int *array, int size)
如上所述,使用[]
只是语法糖。当您调用该函数时,例如:
find(test, 3);
test
自动衰减到指向其第一个元素的指针。如果你打过电话,它就是一样的:
find(&test[0], 3);
现在,看看你的return语句,你可以看到:
return (int) *(&array+sizeof(int)*where);
没有意义 - 首先&array
是参数的地址 - 在这种情况下是一个指针参数,但这并不重要。如果你添加它并取消引用,你将从堆栈中返回一些随机数据,而不是从你想要的数组中返回。
其次,乘以sizeof(int)
是不必要的。 C中的指针运算已经包含了指向类型的大小的隐式乘法。你真正想要回归的是:
return array[where];
相当于:
return *(array + where);
答案 1 :(得分:2)
你这太过于复杂......
return array[where]; // this means, take the base memory location of "array" then
// add in an offset of where and dereference the result
这与:
完全相同return *(array + where);
事实是,在您的main函数中,一旦将其传递给test
函数the array will decay to a pointer,就会有一个名为find()
的数组。所以如果你现在知道你有一个指针,你应该明白为什么你不应该抓住这样的地址:
&array
并且您不需要添加“sizeof”偏移量,因为这是由指针类型(int *
)
答案 2 :(得分:0)
你应该这样做:
return *(array+where);
因为where
是array
的偏移量。您不再需要sizeof(int)