初衷
发现在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;
}