(2)C语言规定,实际参数表达式对形式参数的数据传递是“值传递”的,是单向传递。如实际参数也是变量,则实际参数变量与形式参数是不同的变量,实际参数变量的值传给形式参数,而不能由形式参数直接传回给实际参数。在函数执行过程中,形式参数变量的值可能被改变,但这改变对原先与它对应的实际参数变量没有影响。 2.实际参数向形式参数传递指针 实际参数向形式参数传递变量的指针 函数可以设置指针类型的形式参数,调用带指针类型形式参数的函数时,对应指针形式参数的实际参数必须是相同类型的指针(如胡同类型的某变量的指针),指针形式参数变量从实际参数处得到某变量的指针。指针形式参数对于函数来说有特别的作用,它使函数得到了调用环境中某变量的地址,函数就可用这个地址间接访问函数之外的变量。因此,指针类型形式参数为函数改变调用环境中的数据对象提供了手段。 如希望函数能通过形式参数改变任意指定变量的值,需要在三个方面协调一致: (1)首先,函数应设置指针类型的形式参数; (2)其次,函数体必须通过指针形式参数间接访问变量,或引用其值或修改其值; (3)最后,调用函数时,要以欲改变值的变量的指针为实际参数调用函数。 实际参数向形式参数传递数组元素的指针 为了能使函数处理不同的成组变量,应向形式参数传递数组元素的指针,最通常的情况是数组首元素的指针。由于数组名能代表数组首元素的指针,所以常用数组名实际参数给形式参数传递数组首元素的指针。例如,用于求数组前n个元素和的函数sun(),这个函数被正确地设置有两个形式参数:一个形式参数是数组元素的指针;另一个整型的形式参数用于指定求和数组的元素个数。 【例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 s+=a[i] ; return s; } 对于数组类型的形式参数来说,函数被调用时,与它对应的实在数组由多少个元素是不确定的,可能会对应一个大数组,也可能会对应一个小数组,甚至会对应数组中的某一段。所以在数组形式参数说明中,形式参数数组不必指定数组元素的个数。任何数组形式参数说明: 类型 形式参数名[ ] 都可改写成: 类型 *形式参数名 函数形式参数也是函数的一种局部变量,指针形式参数就是函数的指针变量,函数sum()的定义又可改写成如下形式: int sum(int *a, int n) { int s=0; for(; n--;) s+=*a++; return s; } 实际参数向形式参数传递字符串某字符的指针 这种情况要求形式参数为字符指针的,对应的实际参数是字符数组某个元素的指针,通常是字符串的首字符指针。由于字符率是用一维的字符数组来实现的,所以字符指针形式参数与指向数组元素指针形式参数有相同的使用方法。但因字符串的特殊性,在编写字符串处理函数时还会有许多技巧。下面以字符串拷贝函数strcpy()的实现为例说明字符指针形式参数的用法。 |