博客开头先提到一点:由于我异常的弱 ,所以这个部分更倾向于实用而不是介绍理论。
来让我们从动态数组的第一个函数开始:
malloc:
这个函数的原型是:
void*malloc(unsigned int size);
这个函数使用时需要先定义一个特定的类型,再用这个类型接受这个开辟的空间。
来个完成的开辟的例子吧
#include<stdio.h>
#include<stdlib.h>//忘了提到了,用动态数组时必须用这个头文件
int main()
{
int*p=NULL;
int n;
scanf("%d",&n);//实现了想开辟几个就开辟几个的特点
p=(int*)malloc(n*sizeof(int));
马后炮:这个程序的最后一行还应当进行详细解释:
(int*)代表着我要把他改成int型,如果我要float型,那就应该是(float*)。
(nsizeof(int))是因为在不同的操作系统中,可能每种字符的长度并不相同,所以需要增强程序可移植性。
接下来介绍他的孪生弟兄:calloc
孪生弟兄就是个进化版,它会把最开始的开辟的空间都初始化成0。
但使用时有点不相同—还是上面的例子:
(int)calloc(n,sizeof(int));
这样就很清晰了,只是把需要开辟的空间单独拎到前面了而已。
当然,动态数组必然可惜随时更改啊:这就要引出我们可爱的realloc。
还是之前的那了例子:realloc(voidp,100sizeof(int))
这样我们就改变了这个空间。
二维数组的空间开辟也是同理:
只是开辟了一个nm的空间而已,只举一个例子:
(int)malloc(mnsizeof(int));
开辟的过程可能会出现错误,所以我们一定要判断开辟的空间的指针是否是空指针
if(p==NULL)
exit(1)//如果是空指针,就要退出程序
内存的释放:
很简单 free函数:()里放的是指针p。
最后给出mooc上的一个代码:
这个题的目的是编程输入m个班学生(每个班n个学生)的某门课成绩,计算并输出平均分。
#include<stdio.h>
#include<stdlib.h>
void InputArray(int*p,int m,int n);
double Average(int*p,int m,int n);
int main()
{
int *p=NULL,m,n;
double aver;
printf("%d",&m);
scanf("%d",&m);
p=(int*)calloc(m*n,sizeof(int));
if(p==NULL)
{
printf("No enough memory!\n");
exit(1);
}
InputArray(p,m,n);
aver=Average(p,m,n);
printf("aver=%.1f\n",aver);
free(p);
return 0;
}
void InputArray(int *p,int m,int n)
{
for(int i=0;i<m;i++)
{
printf("Please enter scores of class %d:\n",i+1);
for(int j=0;j<n;j++)
{
scanf("%d",&p[i*n+j]);
}
}
}
double Average(int*p,int m,int n)
{
int sum=0;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
sum=sum+p[i*n+j];
}
}
return (double)sum/(m*n);
}
好了,菜鸡对动态数组的介绍到此结束,由于我本人并不知道是否完全正确,如果有错误,请批评指出。
return code;