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