1.指针变量做函数形参
指针数组的分类
一维数组
#include <stdio.h>
float get_avg(float *b,int n);
/*
一维数组
实参是数组名,形参是指针变量
求数组的平均值
*/
int main()
{
float a[5]={10,21,12,13,14};
float avg=0;
avg=get_avg(a,5); //实参是数组名a,普通变量数组大小
printf("数组a的平均值为:%.f",avg);
return 0;
}
float get_avg(float *b,int n) //指针变量b,指向数组a的首地址
{
float avg=0;
int i;
// int i;
//方法二,指针变量保持不变,使用普通变量或数组更改相对值
for(i=0;i<n;i++)
{
printf("%.1f ",*(b+i)); //等价于b[i]
//printf("log:%.f ",*b+i); //错误方式:先取*p指向内容,然后对其内容进行增加i
}
// for(i=0;i<n;i++)
// {
// avg +=*b;
// b++; //avg是所有元素累加的和,指针变量b的每次循环,往后移动一次
// }
//方法二,指针变量保持不变,使用普通变量或数组更改相对值
for(i=0;i<n;i++)
{
avg +=*(b+i); //avg是所有元素累加的和,指针变量b的每次循环,往后移动一次,等价于b[i]
}
avg /= n;
return avg;
}
二维数组
#include <stdio.h>
float get_avg(float (*b)[3],int col,int row);
/*
二维数组
实参是数组名,形参是指针变量
求数组的平均值
*/
int main()
{
float a[3][3]={{10,11,12},{20,21,22},{30,31,32}};
float avg=0;
avg=get_avg(a,3,3);
printf("平均值为:%f",avg);
return 0;
}
//float get_avg(float b[][3],int col,int row)
float get_avg(float (*b)[3],int col,int row)
{
float avg=0;
int i,j;
// printf("log:%.f\n",*(*b)); //第0行0列元素
// printf("log:%.f",*(*(b+1)+1)); //第一行一列的元素
// for(i=0;i<col;i++)
// {
// for(j=0;j<row;j++)
// {
// avg += *(*(b)+j);
// }
// b++; //b增加1,直接加一行
// }
for(i=0;i<col;i++)
{
for(j=0;j<row;j++)
{
avg += *(*(b+i)+j); //等价于b[i][j]
}
}
printf("log: %.f\n",avg);
printf("log:%.f\n",*(*(b+0)+1)); //打印0行1列
avg /= col*row;
return avg;
}
2.函数指针
函数指针最常用的地方在于将一个函数作为参数传递给另一个函数的时候要用函数指针。
将一个函数作为参数传递给另外一个函数,将这个函数称为回调函数。
#include <stdio.h>
int max(int i,int j);
int min(int i,int j);
int process(int (*fun)(int i,int j),int i,int j);
//函数指针----指针保存函数的地址
int main()
{
int a=100,b=200;
int c=0;
// int (*fun)(int i,int j); //函数指针变量的定义, 定义是需要参考函数声明
// fun=max; //初始化,函数指针变量 指向对应函数
// c=fun(a,b);
// c=(*fun)(a,b); //等价于 c=fun(a,b);a
// printf("max c=%d\n",c);
// fun=min;
// c=min(a,b);
// printf("min c=%d\n",c);
c=process(max,a,b); //process()被调函数,max()回调函数
printf("max c=%d\n",c);
c=process(min,a,b); //process()被调函数,min()回调函数
printf("min c=%d\n",c);
return 0;
}
int process(int (*fun)(int i,int j),int i,int j)
{
int ret;
ret = fun(i,j);
return ret;
}
int max(int i,int j) //函数名实际就是函数的首地址,或称为入口地址
{
if(i>j)
return i;
else
return j;
}
int min(int i,int j)
{
if(i<j)
return i;
else
return j;
}