内容正文:
第10章 函数参数传递进阶
函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针类型数据。
【例10.1】交换两个指针变量所指向的变量的值
#include "stdio.h"
void test(int *p1,int *p2) /* 形参为指针变量 */
{ int p;
p=*p1; *p1=*p2; *p2=p;
}
main( )
{ int a1=10,a2=20;
int *pa1,*pa2;
pa1=&a1; pa2=&a2;
test(pa1,pa2);/* 指针变量作为函数的实参 */
printf("%d,%d\n",a1,a2);
}
10.1 指针变量作为函数参数
void test(int *p1,int *p2) /* 形参为指针变量 */
{ int *t;
t=p1; p1=p2; p2=t;
}
main( )
{ int a1=10,a2=20;
int *pa1,*pa2;
pa1=&a1; pa2=&a2;
test(pa1,pa2);/* 指针变量作为函数的实参 */
printf("%d,%d\n",a1,a2);
}
没有改变主调函数中变量的值
【例】交换两个指针变量所指向的变量的值
void test(int *p1,int *p2) /* 形参为指针变量 */
{ int p;
p=*p1; *p1=*p2; *p2=p;
}
main( )
{ int a1=10,a2=20;
int *pa1,*pa2;
pa1=&a1; pa2=&a2;
test(pa1,pa2);/* 指针变量作为函数的实参 */
printf("%d,%d\n",a1,a2);
}
int a[2]={10,20};
test(a);
void test(int *p)
{ int t;
t=*p;*p=*(p+1);*(p+1)=t;
}
10.2数组名和数组指针变量作函数参数
对于数组来说,数组名、数组指针变量以及数组元素的指针均为指针类型数据,当它们作为函数的实参时,相应的形参应为同类型的指针变量。
main( )
{ int a[20];
func(a,20);
}
func(int *b,int n)
{
}
main( )
{ int a[20],*pa=a;
func(pa,20);
}
func(int *b,int n)
{
}
int b[]
【例9.8】 利用选择法将数组中的n个整数由小到大排序。
#include "stdio.h"
main( )
{
int [6]={10,4,12,34,2,56};
int i;
void sort(int *b,int n);
sort(a,6);
for(i=0;i<6;i++)
printf("%4d",a[i]);
printf("
");
}
void sort(int *b,int n)
{ int i,j,k,t;
for(i=0;i<n-1;i++)
{ k=i;
for(j=i+1;j<n;j++)
if(*(b+j)<*(b+k))k=j;
t=*(b+i);
*(b+i)=*(b+k);
*(b+k)=t;
}
}
归纳起来,如果有一个实参数组,想通过函数调用改变此数组元素的值,实参与形参的对应关系有以下4种等价形式:
形参和实参都用数组名;
实参用数组名,形参用数组指针变量;
实参形参都用数组指针变量;
实参为数组指针变量,形参为数组名。
【例】已知某班4位学生5门课的成绩,计算总平均分数,并输出某个学生各门课的成绩。
二维数组的指针作函数实参时,有列指针和行指针两种形式。相应的,用来接受实参数组指针的形参,必须使用相应形式的指针变量,如下所示:
(1) 实参用列指针,形参用(列)指针变量。
(2) 实参用行指针,形参用行指针变量。
10.3 行数组指针变量作函数参数
#include "stdio.h"
main( )
{ void average(float *ap,int n,int k); /* 函数的声明 */
void search(float (*p)[6],int n,int m); /* 函数的声明 */
float cj[4][6]={{3,65,67,70,60,