指针数组
1.一维数组
#include <stdio.h>
float get_avg(float *p, int a);
int main()
{
float a[5]={12,16,19,54,11};
float avg;
avg=get_avg(a,5);
printf("数组的平均数为:%.1f",avg);
return 0;
}
float get_avg(float *p, int a)
{
int i;
float avg=0;
for(i=0;i<a;i++){
avg+=*p;
p++;
}
avg/=a;
return avg;
}
传的是数组名称,定义接受的为指针,接受地址,数组也可以看为是地址
2.二维数组
#include <stdio.h>
float get_avg(float (*p)[4],int a,int b);
int main()
{
float arr[3][4]={{12,18,54,33},{11,5,67,66},{14,15,57,33}};
float avg;
avg=get_avg(arr,3,4);
printf("数组平均数为:%.1f",avg);
return 0;
}
float get_avg(float (*p)[4],int a,int b)
{
int i,j;float avg=0;
for(i=0;i<a;i++){
for(j=0;j<b;j++){
avg+=*(*(p)+j);
}p++;
}
printf("%f\n",avg);
avg=avg/(a*b);
return avg;
}
被掉函数定义接受(*p)相当于行,[4]为列,所以打印的时候*(p+i)表示行,也可为*(p),p++;
指针函数
#include <stdio.h>
int *fun();
int main()
{
int *a;
int i;
a=fun();
printf("返回的地址:%#x ",a);
printf("值为:%d\n",*a);
for(i=0;i<5;i++){
printf("%d ",*a);
a++;
}
return 0;
}
int *fun()
{
static int a[5]={11,22,3,44,55};
int *p=&a;
printf("地址:%#x\n",p+3);
return p=a;
}
结果为:
函数调用,开辟空间是动态分配,分配在栈区 当函数执行完后,所占用空间就被释放,所传过来的地址内容也相应不准确,前加static将其分配到静态区
加static后结果为:
函数指针
#include <stdio.h>
int add(int a,int b);
int jian(int a,int b);
int cheng(int a,int b);
int chu(int a,int b);
int main()
{
int a=120,b=115;
int c;
char ch;
printf("请输入你要进行运算的数(中间空格隔开):");
scanf("%d %d",&a,&b);
getchar();
printf("选择你要进行运算的方式(+、-、*、/):");
ch=getchar();
switch(ch){
case '+':
c=process(add,a,b);
printf("两数之和为:%d\n",c);
break;
case '-':
c=process(jian,a,b);
printf("两数之差为:%d\n",c);
break;
case '*':
c=process(cheng,a,b);
printf("两数之积为:%d\n",c);
break;
case '/':
c=process(chu,a,b);
printf("两数相除为:%d\n",c);
break;
default:
break;
}
return 0;
}
int process(int (*fun)(int a,int b),int a,int b)
{
int ret;
ret=fun(a,b);
return ret;
}
int add(int a,int b)
{
int ret;
ret=a+b;
return ret;
}
int jian(int a,int b)
{
int ret;
ret=a-b;
return ret;
}
int cheng(int a,int b)
{
int ret;
ret=a*b;
return ret;
}
int chu(int a,int b)
{
int ret;
ret=a/b;
return ret;
}
通过一个函数实现多个函数的调用
作业:
编写一个函数fun,函数的功能是分别求出数组中所有奇数之和,以及所有偶数之和,形参N给了数组中数据的个数;利用指针变量odd返回奇数之和,利用指针变量even返回偶数之和;
主函数打印结果
提示:fun(int *arr, int n, int *odd, int *even)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/*编写一个函数fun,函数的功能是分别求出数组中所有奇数之和,
以及所有偶数之和,形参N给了数组中数据的个数;利用指针变量odd返回奇数之和,
利用指针变量even返回偶数之和;
主函数打印结果
提示:fun(int *arr, int n, int *odd, int *even)*/
void scan(int arr[],int a);
void fun(int *arr,int n,int *add,int *even);
int main()
{
int i;
int sum_ji=0,sum_ou=0;
int *odd;
odd=&sum_ji;
int *even;
even=&sum_ou;
int arr[10];
scan(arr,10);
for(i=0;i<10;i++)
printf("%d ",arr[i]);
printf("\n");
// printf("%d %d\n",*odd,*even);
fun(arr,10,odd,even);
printf("数组中的奇数之和为:%d\n数组中的偶数之和为:%d",*odd,*even);
return 0;
}
void scan(int arr[],int a)
{
int i;
srand((unsigned)time(NULL));
for(i=0;i<a;i++)
arr[i]=rand()%20+1;
}
void fun(int *arr,int n,int *add,int *even)
{
int i;
for(i=0;i<n;i++){
if(0==(*(arr+i)%2)){
*even+=*(arr+i);
}
else
*add+=*(arr+i);
}
// printf("%d %d",*add,*even);
}
结果为:
2. 编写一个程序,声明一个3*5的数组并初始化,具体数值可随意,程序打印出
数值,然后数值翻一番,接着再次打印出新值,编写-一个函数来显示数组内容,
在编写另一个函数执行翻倍功能,数组名和数组行数作为参数由程序传递给函数
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/*编写一个程序,声明一个3*5的数组并初始化,具体数值可随意,程序打印出
数值,然后数值翻一番,接着再次打印出新值,编写-一个函数来显示数组内容,
在编写另一个函数执行翻倍功能,数组名和数组行数作为参数由程序传递给函数*/
void print(int arr[3][5],int a,int b);
void dou(int (*arr)[5],int a);
void p(int (*arr)[5],int a);
int main()
{
int arr[3][5]={0};
int i,j;
srand((unsigned)time(NULL));
for(i=0;i<3;i++){
for(j=0;j<5;j++)
arr[i][j]=rand()%20+1;
}
//print(arr,3,5);
p(arr,3);
dou(arr,3);
printf("\n");
//print(arr,3,5);
p(arr,3);
return 0;
}
void print(int arr[3][5],int a,int b)
{
int i,j;
for(i=0;i<a;i++){
for(j=0;j<b;j++)
printf("%d ",arr[i][j]);
printf("\n");
}
}
void dou(int (*arr)[5],int a)
{
int i,j;
for(i=0;i<a;i++){
for(j=0;j<5;j++)
*(*arr+j)=2*(*(*arr+j));
arr++;
}
}
void p(int (*arr)[5],int a)
{
int i,j;
for(i=0;i<a;i++){
for(j=0;j<5;j++)
printf("%d ",*(*(arr+i)+j));
// arr++;
printf("\n");
}
}
结果为:
3.计算器程序修改,主调函数使用函数名做为实参,被调函数形参使用函数指针类型
#include <stdio.h>
/*计算器程序修改,主调函数使用函数名做为实参,
被调函数形参使用函数指针类型*/
int add(int a,int b);
int jian(int a,int b);
int cheng(int a,int b);
int chu(int a,int b);
int main()
{
int a=120,b=115;
int c;
char ch;
printf("请输入你要进行运算的数(中间空格隔开):");
scanf("%d %d",&a,&b);
getchar();
printf("选择你要进行运算的方式(+、-、*、/):");
ch=getchar();
switch(ch){
case '+':
c=process(add,a,b);
printf("两数之和为:%d\n",c);
break;
case '-':
c=process(jian,a,b);
printf("两数之差为:%d\n",c);
break;
case '*':
c=process(cheng,a,b);
printf("两数之积为:%d\n",c);
break;
case '/':
c=process(chu,a,b);
printf("两数相除为:%d\n",c);
break;
default:
break;
}
return 0;
}
int process(int (*fun)(int a,int b),int a,int b)
{
int ret;
ret=fun(a,b);
return ret;
}
int add(int a,int b)
{
int ret;
ret=a+b;
return ret;
}
int jian(int a,int b)
{
int ret;
ret=a-b;
return ret;
}
int cheng(int a,int b)
{
int ret;
ret=a*b;
return ret;
}
int chu(int a,int b)
{
int ret;
ret=a/b;
return ret;
}
结果为: