本文共 1945 字,大约阅读时间需要 6 分钟。
这一段时间,在做一些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#include #include 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#include #include 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
使用上面行指针的方法在linux下使用gcc编译可以通过,但是在VC++上编译却报错。在VC++中使用双重指针来解决这个问题,代码如下:
#include运行结果如下:#include #include 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
本文参考了一些文章: