sky*_*oor 7 c c++ arrays parameters
关于在C/C++中传递数组我有点困惑.我看到一些签名就像这样的情况
void f(int arr[])
Run Code Online (Sandbox Code Playgroud)
有些是这样的
void f(int arr[], int size)
Run Code Online (Sandbox Code Playgroud)
任何人都可以详细说明有什么区别以及何时以及如何使用它?
首先,传递给函数的数组实际上将指针传递给数组的第一个元素,例如,如果你有的话
int a[] = { 1, 2, 3 };
f(a);
Run Code Online (Sandbox Code Playgroud)
然后,f()
被&a[0]
传递给它.因此,在编写函数原型时,以下内容是等效的:
void f(int arr[]);
void f(int *arr);
Run Code Online (Sandbox Code Playgroud)
这意味着数组的大小会丢失,并且f()
通常无法确定大小.(这就是我更喜欢void f(int *arr)
表格的原因void f(int arr[])
.)
有两种情况f()
不需要信息,在这两种情况下,可以没有额外的参数.
首先,有一些特殊的,同意的价值,arr
即呼叫者和f()
意思是"结束".例如,人们可以同意一个值0
意味着"完成".
然后人们可以写:
int a[] = { 1, 2, 3, 0 }; /* make sure there is a 0 at the end */
int result = f(a);
Run Code Online (Sandbox Code Playgroud)
并定义f()
类似的东西:
int f(int *a)
{
size_t i;
int result = 0;
for (i=0; a[i]; ++i) /* loop until we see a 0 */
result += a[i];
return result;
}
Run Code Online (Sandbox Code Playgroud)
显然,上述方案仅适用,如果双方在主叫用户和被叫同意的公约,并按照它.一个例子是strlen()
C库中的函数.它通过查找a来计算字符串的长度0
.如果你传递了一些没有0
结尾的东西,所有的赌注都会被取消,你处于未定义的行为区域.
第二种情况是你没有真正的阵列.在这种情况下,f()
获取指向对象的指针(int
在您的示例中).所以:
int change_me = 10;
f(&change_me);
printf("%d\n", change_me);
Run Code Online (Sandbox Code Playgroud)
同
void f(int *a)
{
*a = 42;
}
Run Code Online (Sandbox Code Playgroud)
很好:f()
无论如何都不在阵列上运行.