一个三维数组a[i][j][k],数据元素为i*j*k个,在存储空间中顺序连续存储的,我们可以通过数组首地址,通过位移量来访问每一个元素。
假设三维数组每一维的最大长度为n,m,o;
在二维数数组中,我们访问元素是a[i][j]的地址=a[0][0]的地址+i*第一维的长度+j
同理在三维数组中我们可以把二维数组看成一个整体也就是a[i][j,k],这样访问就是
a[i][j,k]的地址=a[0][0,0]的地址+i*第二维和第一维的长度+a[j,k],而a[j,k]的地址就是
二维数组的地址,即a[i][j][k]地址=a[0][0][0]的地址+i*m*o+j*o+k;
同理n维就有了公式:
a[i][j][k]的地址=a[0][0]....[0]的地址+(b2*b3*....bn)*j1+(b3*b4...bn)*j2+...bn*jn-1+jn
用ci-1表示bi*cn-1;
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
typedef int datatype;
typedef struct
{
datatype *base;//作为三维数组首地址
int index[3]; //记录每一维 的长度
int c[3]; //记录维数前面几维一行的数目,如c[0]记录第一维第二维一行的总数
}arr;
int init_arry(arr *A,int b1,int b2,int b3) //初始化数组
{
if(b1<=0||b2<=0||b3<=0)
{
cout<<"error!"<<endl;
return 0;
}
int sum = b1*b2*b3;
A->base = (datatype*)malloc(sizeof(sum*sizeof(datatype)));
if(A->base==NULL) return 0;
A->index[0]=b1,A->index[1]=b2,A->index[2]=b3;
A->c[0]=b2*b3,A->c[1]=b3,A->c[2]=1;
return 1;
}
int value(arr *A,int i1,int i2,int i3,datatype *x) //三维数组中查询某一值
{
int id;
if(i1<0||i1>=A->index[0]||i2<0||i2>=A->index[1]||i3<0||i3>=A->index[2])
{
cout<<"error!"<<endl;
return 0;
}
id=A->c[0]*i1+A->c[1]*i2+A->c[2]*i3;
*x=*(A->base+id);
return 1;
}
int assig(arr *A,int i1,int i2,int i3,datatype x) //改变某一值
{
int id;
if(i1<0||i1>=A->index[0]||i2<0||i2>=A->index[1]||i3<0||i3>=A->index[2])
{
cout<<"error!"<<endl;
return 0;
}
id=A->c[0]*i1+A->c[1]*i2+i3*A->c[2];
*(A->base+id) = x;
return 1;
}
void Scanf(arr *A)
{
int len = A->index[0]*A->index[1]*A->index[2];
for(int i=0;i<len;i++)
*(A->base+i) = i;
// scanf("%d",A->base+i);
}
void Printf(arr *A)
{
int len =A->index[0]*A->index[1]*A->index[2];
for(int i=0;i<len;i++)
cout<<*(A->base+i) <<endl;
}
int main()
{
int n,m,k;
int i1,i2,i3,x;
arr A;
cout<<"输入三维数组每一维的大小:";
cin>>n>>m>>k;
int judge= init_arry(&A,n,m,k);
if(judge) cout<<"success"<<endl;
else
{
cout<<"fail"<<endl;
return 0;
}
Scanf(&A);
cout<<"输入要访问位置的坐标:"<<endl;
cin>>i1>>i2>>i3;
judge = value(&A,i1,i2,i3,&x);
cout<<"坐标在(i1,i2,i3)的值为"<<x<<endl;
x=100000;
assig(&A,i1,i2,i3,x);
Printf(&A);
}