指针编程

本文探讨了在指针编程中如何查找最大和最小月份支出,强调了指针在二维数组处理中的作用,以及指针函数和全局变量的使用注意事项。提到了指针初始化的重要性,以及指针作为函数参数时的数据传递特性。
摘要由CSDN通过智能技术生成

题目:请编写一个程序,输入某年度,某几个月的各项支出。输出单月支出最大的月份的支出总额,和单月支出最小的月份的支出总额
输入数据:
输入数据有多行,其中第一行包含两个正数m,n,代表有m个月,n项支出。之后有m行的数据输入,每行包含n个正数,代表某月的n项支出的数额。
要求:
将查找最大月与最小月编写成两个返回指针的函数

#include<stdio.h>
int max=0,min;
int *s1(int (*a)[20],int n,int m)
{
	int *maxp,i,j,s;
	for(i=0;i<m;i++)//逐行遍历累加
	{
		s=0;//每累加完一行将s清零
		for(j=0;j<n;j++)
		{
		 s+=*(*(a+i)+j);//*(*(a+i)+j)表示二维数组a【i】【j】的值,累加一行数据的值
		}
		if(s>max)
		max=s;
	}
	maxp=&max;//取max的地址
	return maxp;//返回指向最大值指针
}
int *s2(int(*a)[20],int n,int m)//查找最小值的指针函数,与查找最大值有所不同,最小值需先单独遍历第一行的数据累加赋值给min,而最大值只需使max=0.
{
	int *minp,j,i,min,s=0;
	for(j=0;j<n;j++)
	{ 
	 min+=a[0][j];
    }
    for(i=1;i<n;i++)
    {
    	s=0;
    	for(j=0;j<n;j++)
    	{
    		s+=*(*(a+i)+j);
		}
		if(s<min)
		min=s;
	}
	minp=&min;
	return minp;
}
int main(void)
{
	int m,n,i,j,a[12][20],*maxs,*mins;//月份已确定最多为十二个月
	scanf("%d%d",&m,&n);
	if(n<20)
	{
		for(i=0;i<m;i++)
		{
			for(j=0;j<n;j++)
			{
			 scanf("%d",&a[i][j]);//通过输入将所需计算的数据传给数组
			}
		}
		maxs=s1(a,n,m);//将传给数组的数据交给函数运算,主函数调用子函数的实参,是二维数组的首元素首地址
		mins=s2(a,n,m);
		printf("max=%d\n",*maxs);
		printf("min=%d\n",*mins); 
	}
	else
	{
		printf("项目过多"); //防止输入的数据过多,检查数组下标是否越结界
		
	}
 } 

##反思与总结
(1) (a)[20]表示数组指针,不能写为a[20],因为【】的运算级高于*,a[20]为指针数组,数组指针在传参时就接收数组的地址,数组指针对应的是二维数组,所以(a)[20]可以接受主函数a【12】【20】的值。这是由指向行的指针变量来实现表示二维数组。另外二维数组的表示还有两种方法,一种直接用下标表示,即a【12】【20】;或者用指向数组元素的指针,即p=&a【0】【0】通过遍历p++指向二维数组的下一个元素。下标法比较直观但需先计算元素地址,执行效率较低。而用指针指向元素的方法按内存存放顺序依次处理;指向行的指针变量来实现表示二维数组,指针每移动一次,跳过该行的20列的数据,提高执行效率。
(2)max min要为全局变量,否则,当第二个函数被调用时会覆盖第一个原有的数据,导致两个指针指向同一个地址,导致最大值数据等于最小值,即max min不能在函数内int。
(3)由于输入数据的项目多少不确定,二维数组中列的元素个数不确定,所以输入时可利用if判断是否越界,一旦数据越界,停止输入,防止数组因越界可能造成程序崩溃。
(4)s1(int (a)[20],int n,int m)为指针函数,简单的来说,就是一个返回指针的函数,其本质是一个函数,而该函数的返回值是一个指针,与函数指针区别(f)(int x,int y);其本质为一个指针,指向一个函数。
(5)对于指针,指针变量定义后,变量值不确定,引用前必须先赋值,即指针变量的初始化,若未初始化,它指向一个不确定的储存单元,如果这时引用指针,改变了这个不确定单元的值,可能会影响系统的正常运行。所以应用指针变量时必须记得对其初始化。
(6)可以为指针运算符,也可以为指针说明符,在指针变量声明中,为指针说明符,表示其后变量是指针类型,而表达式中出现的则是一个运算符,用来表示指针变量所指变量的当前值;运算符不仅能取的内存地址的内容,也可以修改内存地址中的内容。
(7)指针函数的特点,函数参数可以为整型,浮点型,字符型,也可以为指针类型,当函数的实参为一般变量或常数时,实参与形参之间的数据传输是单向值传递,调用的函数不能改变实参的值,而利用指针作为形参时,即以变量的地址作为实参,其实参与形参之间的数据传递为双向地址传递。
(8));//
(a+i)+j)表示二维数组a【i】【j】的值,而
(a+i)+j表示二维数组a【i】【j】的地址,因为加减号的运算优先级高于指针运算符
;要表示更多维数组的值,以此类推,再加

编程运行视频地址:https://www.bilibili.com/video/av73549745?pop_share=1

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值