C/C++中关于动态生成一维数组和二维数组的学习

        这一段时间,在做一些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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值