指针与数组--动态数组(2)[1、长度可变的一维动态数组 2、长度可变的二维动态数组]

目录

一、长度可变的一维动态数组

二、长度可变的二维动态数组


    由上篇文章的理论,接下来使用例题来阐述。  

一、长度可变的一维动态数组

   例题1、编程输入某班学生的某门课成绩,计算并输出平均值。学生人数由键盘输入。

#include <stdio.h>
#include <stdlib.h>

void InputArray(int *p,int n);
double Average(int *p,int n);

int main(void)
{
	int *p = NULL,n;
	double aver;
	printf("How many students?");
	scanf("%d",&n);							//输入学生人数 
	p = (int *)malloc(n*sizeof(int));		//向系统申请内存 
	if(p==NULL)					//确保指着使用前是非空指针,当p为空指针时结束程序运行 
	{
		printf("No enough memory!\n");
		exit(1);
	 } 
	printf("Input %d socre:",n);
	InputArray(p,n);			//输入学生成绩 
	aver = Average(p,n); 		//计算平均分 
	printf("aver= %lf\n",aver); //输出平均分 
	free(p);					//释放系统申请的内存 
	return 0;
}
//形参声明为指针变量,输入数组元素值 
void InputArray(int *p,int n)
{
	int i;
	for(i=0;i<n;i++)
	{
		scanf("%d",&p[i]);
	}
}
//形参声明为指针变量,计算数组元素的平均值 
double Average(int *p,int n)
{
	int i,sum=0;
	for(i=0;i<n;i++)
	{
		sum = sum + p[i];
	}
	return (double)sum/n;
}

         程序第11行语句像系统申请n个int型的存储单元,用int型指针变量p指向了这段连续存储空间的首地址。这就相当于建立了一个一维动态数组,可通过首地址p来寻址数组中的元素,即可以使用*(p+i)或者p[i]来表示数组元素值。

注意:程序第12~16行的语句并非是可有可无的。因为堆栈空间是有限的,所以动态分配内存后,必须用第12~16行语句检测函数malloc()的返回值,确保指针使用前是非空指针(不是NULL)。如果动态内存分配后返回的指针为NULL,那么就说明内存分配未成功。一定是内存不足或者内存已经耗尽,此时必须用exit(1)终止整个程序的执行

最后,不要忘记使用free()释放不再使用的动态申请的内存。

删除分配的内存空间后:

二、长度可变的二维动态数组

例题2:编程输入m个班学生(每个班n个学生)的某门课成绩,计算并输出平均分。班级数和每班学生数由键盘输入。

#include <stdio.h>
#include <stdlib.h>
 
void InputArray(int *p,int m,int n);
double averarray(int *p,int m,int n);

int main(void)
{
	int *p= NULL,n,m;
	double aver;
	printf("How many classes?");
	scanf("%d",&m);
	printf("How many students?");
	scanf("%d",&n);
	p = (int *)calloc(m*n,sizeof(int));
	if(p==NULL)
	{
		printf("No enough memory!\n");
		exit(1);
	}
	InputArray(p,m,n);
	aver = averarray(p,m,n);
	printf("aver=%.lf\n",aver);
	free(p);
	return 0;
}

void InputArray(int *p,int m,int n)
{
	int i,j;
	for(i=0;i<m;i++)
	{
		printf("Please enter scores of  class %d:\n",i+1);
		for(j=0;j<n;j++)
		{
			scanf("%d",&p[i*n+j]);
		}
	}
}

double averarray(int *p,int m,int n)
{
	int i,j,sum=0;
	for(i=0;i<n;i++)
	{
		for(j=0;j<m;j++)
		{
			sum=sum+p[i*n+j];
		}
	}
	return (double)sum/(n*m);
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值