为什么我推荐使用一级指针创建二维数组?

1、对于 n n n m m m列的二维数组 a a a a [ i ] [ j ] a[i][j] a[i][j] a [ i ∗ m + j ] a[i*m+j] a[im+j]这两种数组元素的访问方式的效率是一样的

#include <time.h>
#include <stdio.h>
#include <math.h>

#define ROWS 6000
#define COLUNMS 5000
double a[ROWS][COLUNMS], b[ROWS * COLUNMS];

void main(void)
{
	long i, j, startTime, finishTime;

	startTime = clock();
	for (i = 0; i < ROWS; i++)
	{
		for (j = 0; j < COLUNMS; j++)
		{
			a[i][j] = sin(i * j);
		}
	}
	finishTime = clock();
	printf("Elapsed time of expression 'a[i][j] = sin(i * j)'is %f s\n", (finishTime - startTime) / 1000.0);

	startTime = clock();
	for (i = 0; i < ROWS; i++)
	{
		for (j = 0; j < COLUNMS; j++)
		{
			b[i * COLUNMS + j] = sin(i * j);
		}
	}
	finishTime = clock();
	printf("Elapsed time of expression 'b[i * COLUNMS + j] = sin(i * j)'is %f s\n", (finishTime - startTime) / 1000.0);
	
	getchar();
}

在这里插入图片描述

2、二维数组作为函数参数时,其列数必须是已经确定的常数,这使得函数不通用

#define ROWS 3
#define COLUNMS 2

double matrix_sum(double matrix[][COLUNMS], int rows, int colunms)
{
	int i, j;
	double sum = 0.0;

	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < colunms; j++)
		{
			sum += matrix[i][j];
		}
	}
	return sum;
}

double matrix_sum2(double matrix[], int rows, int colunms)
{
	int i, j;
	double sum = 0.0;

	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < colunms; j++)
		{
			sum += matrix[i * colunms + j];
		}
	}
	return sum;
}

void main(void)
{
	double sum, sum2, sum3;
	double matrix[ROWS][COLUNMS] = { {1, 2}, {3, 4}, {5, 6} };
	double matrix2[ROWS * COLUNMS] = { 1, 2, 3, 4, 5, 6 };
	double matrix3[3 * 4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };

	sum = matrix_sum(matrix, ROWS, COLUNMS);     //对输入二维数组的列数有要求
	sum2 = matrix_sum2(matrix2, ROWS, COLUNMS);  //对输入二维数组的列数无要求
	sum3 = matrix_sum2(matrix3, 3, 4);           //对输入二维数组的列数无要求
}

3、如果使用二级指针创建动态二维数组,对堆内存分配是否成功的判断显得特别繁琐,使用一级指针则简洁得多

#include <stdlib.h>
void main(void)
{
	int i, j;
	double *a = NULL, *b = NULL, **c = NULL;
	double *d = NULL, *e = NULL, *f = NULL;

	// 采用二级指针创建动态二维数组的例子
	// malloc
	a = (double *)malloc(10 * sizeof(double));
	b = (double *)malloc(20 * sizeof(double));
	c = (double **)malloc(30 * sizeof(double*));
	if (a == NULL || b == NULL || c == NULL)
	{
		free(a); a = NULL;
		free(b); b = NULL;
		free(c); c = NULL;
	}
	for (i = 0; i < 30; i++)
	{
		c[i] = (double *)malloc(40 * sizeof(double));
		if (c[i] == NULL)
		{
			for (j = 0; j < i; j++)
			{
				free(c[j]); c[j] = NULL;
			}
			free(c); c = NULL;

			free(a); a = NULL;
			free(b); b = NULL;
		}
	}

	// do something

	// free
	free(a); a = NULL;
	free(b); b = NULL;
	for (i = 0; i < 30; i++)
	{
		free(c[i]); c[i] = NULL;
	}
	free(c); c = NULL;



	// 采用一级指针创建动态二维数组的例子
	// malloc
	d = (double *)malloc(10 * sizeof(double));
	e = (double *)malloc(20 * sizeof(double));
	f = (double *)malloc(30 * 40 * sizeof(double));
	if (d == NULL || e == NULL || f == NULL)
	{
		free(d); d = NULL;
		free(e); e = NULL;
		free(f); f = NULL;
	}

	// do something

	// free
	free(d); d = NULL;
	free(e); e = NULL;
	free(f); f = NULL;
}
  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值