目录
由上篇文章的理论,接下来使用例题来阐述。
一、长度可变的一维动态数组
例题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);
}