c一维数组模拟二维数组(平坦化)的一个宏 备忘

c语言创建动态二维数组,大致有三种方法。
其一:先申请一个二级指针,再给每个一级指针申请空间。但是这种方法申请来得存储空间行与行之间不一定是连续的。这在运行时有可能降低cache的命中率,从而导致程序性能降低。
其二:用数组指针,这种方法申请的空间是连续的,但是事先得知道,每一行的元素数量。这有很大的局限性。
其三:就是用一维数组模拟二维数组。这个无局限性,且申请的空间时连续的,符合局部性原理,不会降低cahe命中率降低性能。
所以,如果列数确定的情况下,第三种方法应该是最好用的。
但是使用时又是乘又是加的容易出错,其实可以用宏定义简化,如下:

#include <stdio.h>
#define X2(arr,hang,lie,liemax) ((arr)[(hang)*(liemax)+(lie)])
//arr数组名,hang行下标,lie列下标,liemax总列数,即一行的行数
int main()
{
	int a[12] = {  1, 2, 3,
					4, 5, 6,
					7, 8, 9,
					10,11,12 };
	printf("%d\n", X2(a, 3, 1, 3));
}

参考:https://blog.csdn.net/qq_41822235/article/details/81142107

posted @ 2022-04-19 18:17  enbug  阅读(70)  评论(0)    收藏  举报