1

为什么我的代码不起作用?

#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];

但这不是练习的重点。

4

3 回答 3

3

指针算术并不像您认为的那样起作用。您正在寻找:

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);
于 2013-04-08T18:00:03.320 回答
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,一旦您将它传递给您的find()函数,该数组将衰减为一个指针。所以如果你现在知道你有一个指针,你应该明白为什么你不应该像这样抓取地址:

&array

而且您不需要添加“sizeof”偏移量,因为这是由指针 ( int *)的类型给出的

于 2013-04-08T18:03:23.233 回答
0

你应该做:

return  *(array+where);

因为where是 的偏移量array。你不再sizeof(int)需要

于 2013-04-08T18:01:49.570 回答