用指针接受数组
一维数组用指针接受时,可以直接接受,但二维数组用指针接收就较为复杂,接受二维数组时定义方式为 float (*b)[ 4 ] (*b )代表行 [ 4]代表列 ;
*((*b)+1) 在同一行的列进行跳跃 *( *(b+1) ) 在同一列的行进行跳跃
#include <stdio.h>
float get_avg(float (*b)[4], int x,int y);
int main()
{
float avg;
float *p;
float array[4][4]={{1,2,3,4},{11,12,13,14},\
{21,22,23,24},{31,32,33,34}};
//p=array;
//p=&array; //跟另两种不一样
//p=&array[0]; 三种初始化
printf("%.1f\n", *p);
avg=get_avg(array,4,4);
printf("%.1f\n", avg++);
printf("%.1f", avg);
return 0;
}
float get_avg(float (*b)[4], int x,int y)
{
float avg;
int i,j;
//printf("%.f\n", *(*b+1) ); //b先取内容再给内容加1
//printf("%.f\n", *(*(b+1)) );//b先加1再取b+1的内容
for(i=0;i<x;i++)
for(j=0;j<y;j++)
avg+=*(*(b+i)+j);
return avg/16;
}
指针数组 :是一个数组,元素由指针构成 int *a[10] []比*优先级高,先结合
数组指针 :是一个指针,指向数组的指针 int (*p) [10] 先结合(*p)
指针函数 :是一个函数,可以返回指针的函数
定义方式 int *fun( int x, int y)
#include <stdio.h>
int *fun(int array[]);
int main()
{
int array[3]={8,5,7};
int *pum=NULL;
pum=fun(array); // 需要有指针接受返回的指针
printf("%d", *pum);
return 0;
}
int *fun(int array[]) //需先定义为指针型函数,不然无法返回指针
{
int *p;
p=array;
return p; //返回了指针p
}
函数指针 :是一个指针,指向函数的指针 可以将函数作为实参传递,实现主函数调用 函数,调用函数再接受函数进行调用
定义方式 int process (int (*fun)(int x, int y),int x,int y)
int (*fun)(int x, int y) 是函数指针,可以接受其余函数,从而调用
例· 封装不同函数用指针函数进行调用,实现简单计算器功能
#include <stdio.h>
int jia (int x,int y);
int jian(int x,int y);
int cheng(int x,int y);
int chu(int x,int y);
int process ( int (*fun)(int x, int y),int x,int y);
int main()
{
int x,y,cons;
char ch;
printf("请输入两个数字以空格隔开\n");
scanf("%d %d", &x,&y);
printf("请输入运算符\n");
getchar();
ch=getchar();
switch(ch)
{
case '+':
cons=process(jia,x,y);
break;
case '-':
cons=process(jian,x,y); //实现函数指针功能
break;
case '*':
cons=process(cheng,x,y);
break;
case '/':
cons=process(chu,x,y);
break;
default :
break;
}
printf("%d\n", cons);
return 0;
}
int jia (int x,int y)
{
int ret;
ret=x+y;
return ret;
}
int jian(int x,int y)
{
int ret;
ret=x-y;
return ret;
}
int cheng(int x,int y)
{
int ret;
ret=x*y;
return ret;
}
int chu(int x,int y)
{
int ret;
ret=x/y;
return ret;
}
int process (int (*fun)(int x,int y), int x,int y)
{
int ret;
ret=fun(x,y);
return ret;
}
例 用指针函数返回一个数组的奇数之和,偶数之和
#include <stdio.h>
void *fun(int array[],int x,int *odd,int *even);
int main()
{
int sum_j=0,sum_o=0;
int *odd=&sum_j;
int *even=&sum_o;
int array[10]={0,1,2,3,4,5,6,7,8,9};
fun(array,10,odd,even);
printf("奇数之和%d 偶数之和%d\n", *odd,*even);
return 0;
}
void *fun(int array[],int x,int *odd,int *even)
{
int i;
for(i=1;i<x;i+=2)
*odd+=array[i];
//printf("%d\n", *odd);
for(i=0;i<x;i+=2)
*even+=array[i];
//printf("%d", *even);
}
例 定义一个三行五列数组,引用两个函数,一个函数实现打印功能,一个实现翻倍功能
#include <stdio.h>
void print(int array[3][5], int x,int y);
int main()
{
int array[3][5]={{1,2,3,4,5}\
,{11,12,13,14,15}\
,{21,22,23,24,25} };
print(array,3,5);
multi(array,3,5);
print(array,3,5);
return 0;
}
void print(int array[3][5], int x,int y)
{
int i,j;
for(i=0;i<x;i++)
{
for(j=0;j<y;j++)
printf("%d\t", array[i][j]);
printf("\n");
}
}
void multi(int array[3][5],int x,int y)
{
int i,j;
for(i=0;i<x;i++)
for(j=0;j<y;j++)
array[i][j]*=2;
}