博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C/C++中关于动态生成一维数组和二维数组的学习
阅读量:4056 次
发布时间:2019-05-25

本文共 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

运行结果如下:

本文参考了一些文章:

你可能感兴趣的文章
cppcheck c++静态代码检查
查看>>
在C++中使用Lua
查看>>
socket编程中select的使用
查看>>
所谓的进步和提升,就是完成认知升级
查看>>
长文干货:如何轻松应对工作中最棘手的13种场景?
查看>>
如何用好碎片化时间,让思维更有效率?
查看>>
No.174 - LeetCode1305 - 合并两个搜索树
查看>>
No.175 - LeetCode1306
查看>>
No.182 - LeetCode1325 - C指针的魅力
查看>>
mysql:sql alter database修改数据库字符集
查看>>
mysql:sql truncate (清除表数据)
查看>>
yuv to rgb 转换失败呀。天呀。谁来帮帮我呀。
查看>>
驱动TFT要SDRAM做为显示缓存
查看>>
使用file查看可执行文件的平台性,x86 or arm ?
查看>>
qt 创建异形窗体
查看>>
简单Linux C线程池
查看>>
内存池
查看>>
ipconfig,ifconfig,iwconfig
查看>>
opensuse12.2 PL2303 minicom
查看>>
网络视频服务器移植
查看>>