【例6.2】求数组元素和的函数。
int sum( int *a, int n)
{ int i, s;
for(s=i=0; i< n; i++)
s+=a[i];
return s;
}
利用函数sum(),如有以下变量定义:
int x[]= {1, 2, 3, 4, 5 }, i, j;
则语句
i=sum(x,5); j=sum(&x[2],3);
printf("i=%d\n j=%d\n", i,j);
将输出:
i=15
j= 12
函数调用sum(x,5)将数组x的首元素地址(&x[0])传送给形式参数a;函数调用sum(&x[2], 3)将数组x的元素x[2]的地址(&x[2])传送给形式参数a,而x[2]的地址就是数组元素段x[2]、x[3]、x[4] 的开始地址。
为了明确指明形式参数是数组元素的指针,形式参数的类型可以指定为数组类型的。如改写后的函数sum()定义如下:
int sum(int a[], int n)
{int i,s;
for(s= i=0; i<n; i++)
s+=a[i] ;
return s;
}
对于数组类型的形式参数来说,函数被调用时,与它对应的实在数组由多少个元素是不确定的,可能会对应一个大数组,也可能会对应一个小数组,甚至会对应数组中的某一段。所以在数组形式参数说明中,形式参数数组不必指定数组元素的个数。任何数组形式参数说明:
类型 形式参数名[ ]
都可改写成:
类型 *形式参数名
函数形式参数也是函数的一种局部变量,指针形式参数就是函数的指针变量,函数sum()的定义又可改写成如下形式:
int sum(int *a, int n)
{ int s=0;
for(; n--;)
s+=*a++;
return s;
}
实际参数向形式参数传递字符串某字符的指针
这种情况要求形式参数为字符指针的,对应的实际参数是字符数组某个元素的指针,通常是字符串的首字符指针。由于字符率是用一维的字符数组来实现的,所以字符指针形式参数与指向数组元素指针形式参数有相同的使用方法。但因字符串的特殊性,在编写字符串处理函数时还会有许多技巧。下面以字符串拷贝函数strcpy()的实现为例说明字符指针形式参数的用法。



程序员资料