gpt4 book ai didi

c - 如何使用指针在数组中导航?

转载 作者:太空宇宙 更新时间:2023-11-04 06:35:06 25 4
gpt4 key购买 nike

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

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

但这不是练习的重点。

最佳答案

指针运算并不像您认为的那样有效。您正在寻找:

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 (int) *(&array+sizeof(int)*where);

没有意义 - 首先 &array 是参数的地址 - 在本例中是指针参数,但这并不重要。如果您向它添加并取消引用,您将从您的堆栈返回一些随机数据,而不是您想要的数组。

其次,乘以sizeof(int) 是不必要的。 C 中的指针算术已经包含与所指向类型的大小的隐式乘法。您真正想要返回的是:

 return array[where];

相当于:

 return *(array + where);

关于c - 如何使用指针在数组中导航?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15885725/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com