C语言的数组是一系列数据的集合,无法通过参数将它们一次性传递到函数内部,如果数组作为函数的参数,必须传递数组指针。
void func(int *p, int n) //对数组进行冒泡排序
{
int temp;
for(i = 0; i < n-1; i++)
{
for(j = 0; j < n -i -1; j++)
{
if(p[j]>p[j+1])
{
temp = p[j];
p[j] = p[j+1];
p[j+1] = temp;
}
}
}
for(i = 0; i < n; i++)
{
printf("%d\n", p[i]);
}
}
int main()
{
int a[10] = {3, 6, 1, 8, 7, 0, 4, 9, 2, 5};
func(a, 10);
return 0;
}
运行结果为:
0
1
2
3
4
5
6
7
8
9
此程序中,func函数的参数 *p 仅仅是一个int型指针,在函数内部无法通过这个指针获得数组长度,必须将数组长度作为函数参数传递到函数内部,于是就有了第二个参数 n。
数组做函数参数时,参数也能够以“真正”的数组形式给出。func函数的函数头可以写成下面的形式:
void func(int p[], int n)
或者
void func(int p[10], int n)
上面的两个例子,好像定义了一个数组,甚至元素个数都加进去了,实际上这两种形式的数组定义都是假象。两者都不会创建一个数组出来,最终还是会转换为指针*p。
int p[10]这种形式只能说明函数期望用户传递的数组有 10个元素,并不意味着数组只能有 10 个元素,真正传递的数组可以有少于或多于10 个的元素。
参数的传递本质上是一次赋值的过程,赋值就是对内存进行拷贝。而数组中数据的数量没有限制,可能非常多,对它们进行内存拷贝有可能是一个漫长的过程,会严重拖慢程序的效率,为了规避上述情况,C语言没有从语法上支持数据集合的直接赋值。