这一段时间,在做一些ACM的题,发现几乎每一个题都会用到动态生成的数组,最常用的就是对于输入参数的存储。
下面对一些动态数组的知识做了一些笔记,希望以后能用上。
众所周知,建立数组有两种方法,一种是在声明时声明一个固定大小的数组,如:int a[100];另外一种是申请动态内存来建立数组,利用指针来引用这块地址。
在C语言中要使用动态内存要包含一个头文件即#include<malloc.h> 或者是#include<stdlib.h> 然后用C语言的系统函数 void * malloc(usigned size);来获得动态分配的内存,这个函数参数是需要申请的内存的字节数,返回的是一个申请到的内存的首地址,这个返回的内存的类型是 void ,所以需要根据需要进行强制类型转换,例如 int *array; array= (int *)malloc(sizeof(int)*10);这样就动态申请到了一个有10个int型变量的内存空间了。在释放内存时,使用的是free()函数。
但是在C++中,似乎所使用的语句要简单一些,包含的头文件是#include<iostream.h> 申请内存不需要调用函数只要一个关键字new即可。例如 int *array; array=new int[10]; 注意 int *array=new int(10); 不是申请10个int型的空间,而是申请一个int型的内存空间,然后给他赋值为10。当然 如果用 int *a; a=new int; 那么就是得到了一个能存放int型数据的内存空间了。在释放内存时,使用的是delete关键字。
为了将精力集中于解决问题上,我们经常会把解决问题的方法写到一个函数里面,将终端输入的数据打包成一个数组作为参数传入,将处理的结果作为返回值。这样,可以减少函数之间的耦合度,方便多人同时编写各自的模块。
下面是我写的一些例子:
1.动态申请一维数组,并将其指针作为参数传递。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
void print(int col,int *p);
int main()
{
int i;
int col;
int *p=0;
printf("How many elements you will input?\n");
scanf("%d",&col);
printf("Please input the elements...\n");
p = (int *)malloc(sizeof(int)*col);
for (i = 0; i < col; i++)
{
scanf("%d",&p[i]);
}
print(col,p);
return 0;
}
void print(int col,int *p)
{
int i;
printf("The elements are:\n");
for (i = 0;i < col; i++)
{
printf("%-4d",p[i]);
}
printf("\n");
}
运行结果如下:
2.动态申请二维数组,并将其指针作为参数传递。
#include<stdlib.h>
#include<stdio.h>
#include<malloc.h>
void print(int row,int col,int (*p)[col]);
int main()
{
int i,j;
int row,col;
scanf("%d %d",&row,&col);
int (*p)[col]=(int(*)[col])malloc(row*col*sizeof(int));//注意,这里使用了行指针,这样做的好处是在函数中对数组元素操作时与使用函数名操作相同
for(i=0;i<row;i++)
for(j=0;j<col;j++)
p[i][j]=i*j;
print(row,col,p);
free(p);
return 0;
}
void print(int row,int col,int (*p)[col])
{
int i,j;
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
printf("%4d",p[i][j]);//注意,只有使用行指针时,才能用p[i][j]来表示数组元素
printf("\n");
}
}
使用上面行指针的方法在linux下使用gcc编译可以通过,但是在VC++上编译却报错。在VC++中使用双重指针来解决这个问题,代码如下:
#include<stdlib.h>
#include<stdio.h>
#include<malloc.h>
void print(int row,int col,int **p);
int main()
{
int i,j;
int row,col;
int **p;
//int (*p)[10];
scanf("%d %d",&row,&col);
p = (int **)malloc(row*sizeof(int(*)));
for (i=0;i<row;i++)
p[i]=(int *)malloc(col*sizeof(int));
for(i=0;i<row;i++)
for(j=0;j<col;j++)
p[i][j]=i*j;
print(row,col,p);
for (i=0;i<row;i++)
free(p[i]);
free(p);
return 0;
}
void print(int row,int col,int **p)
{
int i,j;
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
printf("%4d",p[i][j]);
printf("\n");
}
}
本文参考了一些文章:
http://www.cnblogs.com/wanghetao/archive/2011/10/10/2205915.html
http://blog.csdn.net/hondely/article/details/6779887