下面的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 * arr
或int arr[]
相同吗?因为当我传递一个大小为100的int数组时,我可以遍历它并且我不会只限制为10个元素。
答案 0 :(得分:2)
我的问题是:参数
int arr[10]
与撰写int *arr
或int arr[]
相同吗?
是的,只要它是函数参数列表和的声明的一部分,该数组就是一维的。
答案 1 :(得分:2)
是的,函数参数列表中的int arr[10]
,int arr[]
和int *arr
都是完全相同的。
在C99中,您有一个新选项:int arr[static 10]
。这意味着您必须向该函数传递一个指向至少10个元素的地址(在未定义行为的惩罚下)。
答案 2 :(得分:1)
为什么您希望您的代码被“封顶”?会发生什么?
C没有“安全”数组索引,它只会索引你告诉它的位置。你不能走出界限。
在我看来,最好明确地传递大小,因为这样做会使函数更通用,并避免混淆数组/指针问题。
答案 3 :(得分: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的方式并不重要
答案 4 :(得分:0)
如果你做* arr,你基本上是将指针传递给数组的第一个元素。
由于指针的行为可以作为数组使用的补充,所以根本没有问题。
当你执行类似arr [1]的操作时,第一个元素的指针arr会自动增加1并指向数组中第二个元素的地址。