如何使用指针浏览数组?

时间:2013-04-08 17:56:56

标签: c pointers

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

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

但这不是练习的重点。

3 个答案:

答案 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);

因为wherearray的偏移量。您不再需要sizeof(int)