用数组名作函数参数:
数组名表示的是数组首地址,故以数组名作为实参传递时,形参是可以存放该实参类型的指针变量的。
表示形式:
- void fun(int arr[],int n);
- void fun(int *arr,int n);
两种表示形式是等价的。
说明
C语言调用函数时虚实结合的方法都是采用“值传递”方式,当用变量名作为函数参数时传递的是变量的值,而当用数组名作为函数参数时,由于数组名代表的是数组首元素地址,因此传递的值是地址,所以要求形参为指针变量
示例:
将数组a中n个整数按相反顺序存放;
#include<stdio.h>
void reverse(int a[],int n);
int main()
{
int a[10]={
2,4,3,1,5,0,9,8,7,6};
int i;
printf("输出原始数据!\n");
for(i=0;i<10;i++)
{
printf("%d",a[i]);
}
reverse(a,10);
printf("按相反顺序存放后\n");
for(i=0;i<10;i++)
{
printf("%d",a[i]);
}
printf("\n");
return 0;
}
void reverse(int a[],int n)
{
int t,i,j,m;
m=(n-1)/2;
for(i=0;i<=m;i++)
{
j=n-1-i;
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
子函算法属于典型的折半类型。
子函这一段可以用指针,这里让我知道地址可以累加…且配合相加相应顺序数字可表示该元素。
void reverse(int *a,int n)
{
int *p,t,*i,*j,m;
m=(n-1)/2;
i=a;//不加数字时是指数组第一个元素
j=a-1+n;//指向的是数组最后一个元素
p=a+m;
for(;i<=p;i++,j--)
{
t=*i;
*i=*j;
*j=t;
}
}