一维数组求平均值(指针变量做函数的形参)
#include <stdio.h>
//一维数组
//实参是数组名,形参是指针变量
//求数组的平均值
float get_avg(float *b, int n);
int main()
{
float arr[5]={4,8,6,7,1};
float avg=0;
avg=get_avg(arr,5);//实参是数组名a,和普通变量数组的大小
printf("数组arr的平均值为: %.1f\n",avg);
return 0;
}
float get_avg(float *b, int n)//指针变量b,指向数组arr的首地址。
{
float avg=0;//需要返回值
int i;
for(i=0;i<n;i++,b++)
{
avg+=*b;//元素和 ,指针变量b每循环一次 ,往后移动一次
}
avg=avg/n;
return avg;
二维数组求平均值(指针变量做函数的形参)
有了元素的指针,就可以用指针法表示二维元素的数组 , *(*(b+i)+j) 等价于 b[ i ][ j ] 等价于 *(a [ i ] + j ): 指针加1是移动一行,b + i表示第 i 行的指针,也就是第 i 行的首地址;
区别 : p + i 是第 i 行的地址,*(p + i)是第 i 行元素的地址,也可以理解成第 i 行元素的列地址,所以 *(*(p+i)+j) 则是第 i 行第 j 列元素的值,例如: *(*(p+0)+2) 表示第0行第2列元素的值。
//二维数组
//实参是数组名,形参是指针变量
//求数组的平均值
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int get_avg(int (*b)[5],int hang, int lie);
int main()
{
int arr[5][5]={0};
int i,j;
int avg=0;
int max=0;
srand((unsigned)time(NULL));
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
arr[i][j]=rand()%50+10;
printf("%d ",arr[i][j]);
}
printf("\n");
}
avg=get_avg(arr,5,5);//实参是数组名arr,和普通变量数组的大小
printf("数组arr的平均值为:%d",avg) ;
return 0;
}
int get_avg(int (*b)[5],int hang, int lie)//指针变量b,指向数组arr的首地址。
{
int i,j;
int avg=0;
for(i=0;i<hang;i++)
{
for(j=0;j<lie;j++)
{
avg +=*(*(b+i)+j);//等价于b[i][j]
}
}
avg=avg/25;
}
指针函数:指针作为函数的返回值
函数指针
回调函数(函数也可以作为函数的参数来传递)
#include <stdio.h>
//函数指针:指针保存函数的地址
int max(int x,int y) ;
int min(int x,int y) ;
int main()
{
int a=100,b=300;
int m=0;
m=process(max,a,b);//process()被调函数,max()回调函数
printf("max m=%d\n",m);
m=process(min,a,b);//process()被调函数,max()回调函数
printf("min m=%d\n",m);
}
//回调函数
int process(int (*fun)(int x, int y),int x, int y)//函数指针作为参数的形参
{
int ret;
ret=fun(x,y);
return ret;
}
int max(int x,int y)
{
if(x>y)
return x;
else
return y;
}
int min(int x,int y)
{
if(x<y)
return x;
else
return y;
}
作业中的应用
1.编写一个函数fun,函数的功能是分别求出数组中所有奇数之和,以及所有偶数之和,形参N给了数组中数据的个数;利用指针变量odd返回奇数之和,利用指针变量even返回偶数之和;
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int fun(int *arr, int n, int *odd, int *even);
int main()
{
int a[10]={0};
int oddsum=0;int evensum=0;
int *odd=&oddsum;//取地址
int *even=&evensum;
fun(a,10,odd,even);
printf("奇数之和为%d \n",*odd);
printf("奇数之和为%d \n",*even);
return 0;
}
int fun(int *arr, int n, int *odd, int *even)
{
int i;
srand((signed)time(NULL));
for(i=0;i<10;i++)
{
arr[i]=rand()%20+1;
printf("%d ",arr[i]);
}
printf("\n");
for(i=0;i<10;i++)
{
if(arr[i]%2!=0)
*odd+=*(arr+i);//arr[i]
}
for(i=0;i<10;i++)
{
if(arr[i]%2==0)
*even+=*(arr+i);//arr[i]
}
}
结果为:
2.写一个程序,声明一个3*5的数组并初始化,具体数值可随意,程序打印出数值,然后数值翻一番,接着再次打印出新值,编写-一个函数来显示数组内容,在编写另一个函数执行翻倍功能,数组名和数组行数作为参数由程序传递给函数.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int input(int a[3][5],int i,int j);
int fun(int (*b)[5],int i,int j);
int main()
{
int a[3][5]={0};
input(a,3,5);
fun(a,3,5) ;
return 0;
}
int input(int a[3][5],int i,int j)
{
srand((unsigned)time(NULL));
for(i=0;i<3;i++)
{
for(j=0;j<5;j++)
{
a[i][j]=rand()%20+1;
printf("%d\t",a[i][j]);
}
printf("\n");
}
printf("\n");
}
int fun(int (*b)[5],int i,int j)
{
for(i=0;i<3;i++)
{
for(j=0;j<5;j++)
{
b[i][j]=(b[i][j])*2;
printf("%d\t",b[i][j]);
}
printf("\n");
}
}
结果为:
3.计算器程序修改,主调函数使用函数名做为实参,被调函数形参使用函数指针类型。
#include <stdio.h>
//函数指针计算
int plus(int x, int y);
int sub(int x, int y);
int mul(int x, int y);
int div(int x, int y);
int process(int(*fun)(int x, int y),int x, int y);
int main()
{
int a,b,c;char ch,ch1;//ch1为=号
printf("请输入两个整数,该功能可以实现您想要的运算\n");//a + b =这种形式
scanf("%d",&a);
scanf("%c",&ch);
scanf("%d",&b);
scanf("%c",&ch1);//输入=号
switch(ch)
{
case '+' :
c=process(plus,a,b);
printf("%d\n",c);
break;
case '-' :
c=process(sub,a,b);
printf("%d\n",c);
break;
case '*' :
c=process(mul,a,b);
printf("%d\n",c);
break;
case '/' :
c=process(div,a,b);
printf("%d\n",c);
break;
default:
break;
}
return 0;
}
int process(int (*fun)(int x, int y),int x, int y)
{
int ret;
ret=fun(x,y);
return ret;
}
int plus(int x, int y)
{
return x+y;
}
int sub(int x, int y)
{
return x-y;
}
int mul(int x, int y)
{
return x*y;
}
int div(int x, int y)
{
if (y!=0)
{
return x/y;
}
else
{
printf("除数不能为0\n");
return 0;
}
}
结果为: