为了明确指明形式参数是数组元素的指针,形式参数的类型可以指定为数组类型的。如改写后的函数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()的实现为例说明字符指针形式参数的用法。
【例6.3】字符串拷贝函数strcpy()。
该函数功能是将一个已知字符串的内容复制到另一字符数组中。拷贝函数设有两个形式参数from,to。from为已知字符串的首字符指针,to为存储复制字符串首字符指针。函数定义如下:
void strcpy(char *to, char *from,)
{
while( *to++=*from++);
}
3.调用环境与函数共用全局变量
为了减少函数的形式参数,或因若干函数必须共同对一组变量进行处理。可让调用环境与被调用的函数共用一组变量。即在函数调用之前先给变量设置初值,函数对这些变量进行处理,并将处理结果留在全局变量中。由于这种使用方式函数之间相互影响太大,如程序有错,就会很难修正。
6.5 返回指针的函数
函数也可以返回指向某种数据对象的指针值。定义(或说明)返回指针值函数的函数头有以下形式:
类型说明符 * 函数名(形式参数表)
例如,函数说明:
int *f(int,int);
说明函数f()返回指向int型数据的指针,该函数有两个整型形式参数。
在函数名的两侧分别为* 运算符和()运算符,而()的优先级高于*,函数名先与()结合。函数名()是函数的说明形式。在函数名之前的* ,表示此函数返回指针类型的值。
【例6.4】 编制在给定的字符串中找特定字符的第一次出现。若找到,返回指向字符串中该字符的指针;否则,返回NULL值。
设函数为search(),该函数有两个形式参数,指向字符串首字符的指针和待寻找的字符。以下是函数search()的定义:
char *search(char *s,char c)