文档介绍:实验16 指针与函数
指针作为函数参数
1. 形参的类型说明
函数的参数不仅可以是整型、实型、字符型等数据,也可以是指针类型。指针作为函数参数时,注意形参类型要声明为指针类型,如:
vun中的*p1,*p2,*p3就是main中的x,y,z,也就是说,在fun中完成了对main的变量x,y,z的赋值。
运行结果:
数组名作为函数参数
数组作为函数参数的方法是将数组名作为函数参数,而且数组作为函数参数有其特殊性:形参数组与实参数组是同一个数组。
假如有如下程序,main函数将数组a传递给fun函数中的形参b。
fun(int b[], int n) /* 形参b为数组 */
{
……
}
 main()
{
int a[20];……
fun(a,20); /*数组名作为参数*/
……
}
那么,形参数组b与实参数组a是同一个数组,也就是说:a[i] 等同于b[i]。下面我们来说明一下这其中的道理。
 
在C语言中规定:函数的形参int b[]等同于int *b,也就是说,所谓的“形参数组”实际上是一个指针变量。
另外,实参a是数组名,即数组的首地址。因此,表面上好像是实参数组a传递给形参数组b,实际上却是数组首地址a传递传给指针变量b。
对于指针b,也可以有表达式b[i],因为b[i]相当于*(b+i); 而b得到的值为a,所以*(b+i)就是*(a+i),即 a[i]。因此得到结论:a[i]等同于b[i]。
函数返回指针值
如果一个函数的功能是为了求一个指针,它就可以返回一个指针值。这种函数的定义格式:
类型 * 函数名(形参列表)
{
函数体
return(指针);
}
编程范例 例1 编写函数,求一个数组中的最大值和最小值。
#include <>
void max_min(int arr[],int *p1,int *p2, int n)
{
int i,max,min;
max=min=arr[0];
for(i=1;i<n;i++)
{if (max<arr[i]) max=arr[i];
if (min>arr[i]) min=arr[i];}
*p1=max;*p2=min;
}
main()
{
int mx,mn;
int array[]={1,2,3,-5,0,7,15,4,-8,10};
max_min(array,&mx,&mn,10);
printf("最大值是%d\n最大值是%d",mx,mn);
}
使用指针编写字符串处理函数
由于可以用指针指向字符串的首字符,并通过指针的移动访问字符串中的所有字符,因而使用指针编写字符串处理函数时可以使代码更加简洁、效率更高。
 
使用指针编写字符串处理函数时,可以把字符串的首地址作为实参传递给形参。形参是一个指针,但可以看成是字符串,而且该字符串与实参字符串是同一个字符串。
使用指针编写字符串处理函数
#include <>
void thc(char *s,char c)
{
char *p;
for(p=s;*p!='\0';p++)
if (*p>= '\0' && *p>= '\9' ) *p=c;
}
main()
{ char str[20]=“22china567";
thc(str, '#');
printf("%s\n",str);
}
使用指针编写函数,把一个字符串复制到另一个字符数组中。
#include <>
void cpystr(char *s,char *d)
{
char *p,*q;
for(p=s,q=d;*p!='\0';p++,q++)
{*q= *p;} *q= '\0';
}
main()
{ char ps [20]=“CHINA“,dstr[20];
cpystr(ps, dstr);
printf("%s\n",dstr);
}
编程范例
例2 编写函数,在一个已知的字符串中查找给定的字符,如果找到则返回所找字符在字符串中的指针,否则返回空指针NULL。
#include <