C语言 用一维指针访问多维数组函数

373 阅读1分钟

初衷

发现在C语言函数内部试图操作指针类型的数组参数的时候,用常规的[][]形式索引定位数据时编译期会报错。所以,依据数组在内存中的存储方式,试图采用一维数组类型传参(如int* arr,代表数组名),并用i*j+j的方式表示二维以上的数组。如果维数很低且长度确定,那么直接写也行。但是如果遇到三维、四维,甚至更高维度的数组时,就会变得麻烦和困难。所以,编写该函数,方便位于函数内部对多维数组进行读写操作。

功能

用于使用一维数组指针形式表示多维数组,可用于当在函数内对多维数组参数进行读写操作

接口说明

  • inArrStyle: 多维数样式
  • nD: 多维数组维数
  • PosIndex: 索引

用法示例

  • 有四维数组 int arr[10][10][10][10]
  • 欲表示 arr[4][3][2][1]
  • 则可表示为:
  • int arrStyle[4] = {10,10,10,10};
  • int index[4] = {4,3,2,1};
  • arr[getIndexOfArr(arrStyle, 4, index)]
  • arr[4][3][2][1] == arr[getIndexOfArr(arrStyle, 4, index)]

备注

暂时支持不超过4维,不定高维数组待补全

代码

int getIndexOfArr(int* inArrStyle, int nD, int* PosIndex) {

int index = 0;

if (inArrStyle == NULL || PosIndex == NULL)
	return -1;
if (nD <= 0 || nD > 4)
	return -2;

if (nD == 1) {
	return PosIndex[0];
}
else if (nD == 2) {
	index = PosIndex[0] * inArrStyle[1] + PosIndex[1];
}
else if (nD == 3) {
	index = PosIndex[2] + PosIndex[1]* inArrStyle[2] + PosIndex[0] * inArrStyle[1]* inArrStyle[2];//2*4*3 + 2*3 + 2
}
else if (nD == 4) {
	index = PosIndex[3] + PosIndex[0] * inArrStyle[1]* inArrStyle[2]* inArrStyle[3] + PosIndex[1]* inArrStyle[2] * inArrStyle[3] + PosIndex[2]* inArrStyle[3];//2 + 5*5*4*3+4*4*3+3*3
}
else {
	//
	for (int i = 0;;i++) {
		
	}
}

return index;

}