2D array and dynamic array and dynamic 2D array

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>   //malloc()
#include <string.h>   // memset()

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
//---------------------------------------------------------------
//以一维数组的方式遍历二维数组
void printData_1(int* a,int len)
{
	int i = 0;
	for(i=0;i<len;i++)
	{
		printf("%d\n",a[i]);	
	}
}
//以指针的方式遍历二维数组
void printData_2(int (*a)[3],int row)  // int (*a)[3] <=> int a[][3]
{
	int col = sizeof(*a)/sizeof(int);
	int i = 0;
	int j = 0;
	printf("%d\n",sizeof(a));
	for(i=0;i<row;i++)
	{
		for(j=0;j<col;j++)
		{
			printf("%d\n",*(*(a+i)+j));//	a[i][j] <=> *(a[i]+j) <=> *(*(a+i)+j)
		}	
	}
}
//---------------------------------------------------------------
//------------------重置一维动态空间的大小-----------------------
int reset(int** p,int size,int new_size)
{
	int ret = 1;
	int len = 0;
	int i = 0;
	int* pt = NULL;
	int* tmp = NULL;
	int* pp = *p;
	if((p!=NULL)&&(new_size>0))
	{
		pt = (int*)malloc(sizeof(int) * new_size);
		
		memset(pt,0,sizeof(int) * new_size);
		
		tmp = pt;  //做了一个替身tmp
		len = (size<new_size)?size:new_size;
		for(i=0;i<len;i++)
		{
			*tmp++ = *pp++;
		}
		free(p);
		*p = pt;  //  很重要	
	}
	else
	{
		ret = 0;
	}
		
	return ret;
}
void test_1()
{
	int* p = (int*)malloc(sizeof(int)*4);
	int i = 0;
	int length = 0;
	p[0] = 1;
	p[1] = 2;
	p[2] = 3;
	p[3] = 4;
	printf("%x\n",p);
	length = 8;
	if( reset(&p,4,length) )
	{
		printf("%x\n",p);	
	}
	
	for(i=0;i<length;i++)
	{
		printf("%d\n",p[i]);	
	}
	free(p); 
}
//---------------------------------------------------------------
//--------------------动态申请二维数组---------------------------
int** malloc2d(int row,int col)
{
	int** ret = NULL;
	int* p = NULL;
	int i = 0;
	ret = (int**)malloc(sizeof(int*)*row);
	p = (int*)malloc(sizeof(int)*row*col);
	
	if((ret!=NULL)&&(p!=NULL))
	{
		for(i=0;i<row;i++)
		{
			ret[i] = p + i * col;	
		}
	}
	else
	{
		free(p);
		free(ret);
		ret = NULL;	
	}
	
	
	return ret;
}
void free2d(int** a)
{
	free(&a[0][0]);   //这里的free顺序很重要
	free(a);
}
void test_2()
{
	int row = 2;
	int col = 3;
	int** a = malloc2d(row,col);
	int i = 0;
	int j = 0;
	for(i=0;i<row;i++)
	{
		for(j=0;j<col;j++)
		{
			*(*(a+i)+j) = j	;
		}	
	}
	
	printData_1(&a[0][0],row*col); // &a[0][0] <=> a
	
	free2d(a);
}
//----------------------------------------------------------------
int main(int argc, char *argv[]) 
{
	int a[3][3] = {{0,1,2},{3,4,5},{6,7,8}};
	//printData_1(&a[0][0],9);
	printData_2(a,3);
	
	//test_1();
	
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值