2

下面的foo函数找到给定数字的第一次出现并返回它的索引。如果未找到该数字,则返回数组(n)的大小:

‪int foo(int arr[10], int num, int n)‬
{
‫;‪   int *p‬‬
‪   for (p=arr;(*p!=num) && (p<arr+n);++p);‬‬
   ‫;‪return p-arr‬‬
}

我的问题是:参数int arr[10]是否与写作相同int * arrint arr[]就此而言?因为当我传递一个大小为 100 的 int 数组时,我可以遍历它并且我并没有限制为只有 10 个元素。

4

5 回答 5

2

我的问题是:参数int arr[10]是否与写作相同int *arrint arr[]就此而言?

是的,只要它是函数参数列表声明的一部分并且数组是一维的。

于 2013-01-31T12:05:43.417 回答
2

是的,int arr[10],int arr[]int *arr在函数参数列表中都意味着完全相同的东西。

在 C99 中,您有一个选项:int arr[static 10]. 这意味着您必须向函数传递一个指向至少 10 个元素的地址(在未定义行为的惩罚下)。

于 2013-01-31T12:09:56.640 回答
1

为什么您希望您的代码被“封顶”?会发生什么?

C没有“安全”的数组索引,它只会索引你告诉它的地方。不超出界限由您决定。

在我看来,最好明确地传递大小,因为这使函数更通用,并且避免了数组/指针问题的混淆。

于 2013-01-31T12:03:57.077 回答
0

您可以迭代,但在您的记忆区域中,您不应该这样做的干净方法是,

int foo(int *arr, int num, int n)‬
{
    int i;
 ‪   for (i=0;arr[i]!=num && i<n; i++);‬‬
    ‫;‪return i‬‬
}

此外,由于您执行 p=arr 然后使用 p,因此您定义 arr 的方式并不重要

于 2013-01-31T12:05:00.350 回答
0

如果你这样做 *arr ,你基本上是在传递一个指向数组第一个元素的指针。

由于指针的行为可以作为数组使用的补充,所以完全没有问题。

当您执行 arr[1] 之类的操作时,指向第一个元素的指针 arr 会自动递增 1 并指向数组中第二个元素的地址。

于 2013-01-31T12:34:54.677 回答