指针数组 指针函数 函数指针

指针数组

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;
}

结果为:

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值