데이터 구조 배열 순서 저장 상세 소개
최근 에 데이터 구 조 를 공부 하고 배열 의 순서 로 저장 하 는 것 을 보 았 습 니 다. 어 지 럽 고 이해 할 수 없습니다. 많은 것들 이 인터넷 에서 비교적 상세 한 자 료 를 찾 았 습 니 다. 여러분 은 주석 내용 을 잘 보 세 요.
#include
#define MAX_ARRAY_DIM 8 // 8
typedef struct {
ElemType *base; // , InitArray
int dim; //
int *bounds; // , InitArray
int *constants; // , InitArray
}Array;
Status InitArray(Array &A,int dim,...){// “ ” 。 。
// : 4 , :4,5,6,7( ), , :
//InitArray(ar, 4, 4, 5, 6, 7);
//ar ,ar , 4 4 , 4, 5, 6, 7 4
// 5 , :
//InitArray(ar, 5, , , , , );
// dim , A, OK。
if (dim<1 ||dim>MAX_ARRAY_DIM) return ERROR;
A.dim=dim;
A.bounds=(int *)malloc(dim*sizeof(int));
if (!A.bounds) exit(OVERFLOW);
// , A.bounds, A elemtotal。
elemtotal=1;
va_start(ap,dim); //ap va_list , 。
for (i=0;i=0;--i)//A.constants[2] = 7,A.constants[1] = 6*7,A.constants[0] = 5*6*7
A.constants[i]=A.bounds[i+1] * A.constants[i+1];
// , :A.constants , 。 : (2,0,0,0) , (0,0,0,0)~(0,4,5,6) (1,0,0,0)~(1,4,5,6) , 5*6*7 , A.constants[0] !
// !
return OK;
}
status Locate(Array A,va_list ap,int &off){
// ap , A off。
off=0;
for (i=0;i=A.bounds[i]) return OVERFLOW;
off + = A.constants[i] * ind;
}
return OK;
왜 A. constants [dim - 1]
bounds 는 1 차원 마다 개 수 를 저장 합 니 다. constants 는 모든 차원 에서 1 을 추가 하면 메모리 공간 에 대응 하 는 아래 표 시 를 얼마나 늘 려 야 합 니까?말하자면 추상 적 이다. 우 리 는 3 차원 이 라 고 가정 하면 쉽게 말 할 수 있다. 먼저 3 차원 을 bounds [0] 만큼 높 은 것 으로 본다. 모든 0 에서 bounds [0] - 1 의 범위 내 에서 하나의 평면 이다. 이 평면 은 bounds [1] 만큼 길 고 bounds [2] 만큼 넓다.그러면 우 리 는 높이 = 0, 길이 = 0, 너비 = 0 을 메모리 의 첫 번 째 위치 에 대응 하고 높이 = 0, 길이 = 0, 너비 = 1 을 두 번 째 위치 에 대응 합 니 다. 그러면 높이 = 0, 길이 = 1, 너비 = 0 은 어느 위치 에 두 어야 합 니까?분명히 0 + bounds [2] 이 자리 입 니 다.그러면 높이 = 1, 길이 = 0, 너비 = 0 의 그 요 소 는 어느 위치 에 있어 야 합 니까?분명히 높이 = 0 이라는 평면 을 다 놓 은 후의 그 위치 이다. 높이 = 0 이라는 평면 은 길이 * 너비 만큼 많은 요소 가 있다. 즉, bounds [1] * bounds [2] 이렇게 많은 요소 이기 때문에 높이 = 1, 길이 = 0, 너비 = 0 이라는 요 소 는 0 + bounds [1] * bounds [2] 라 는 위치 에 있어 야 한다. 그렇지?만약 에 네 번 째 차원 이 있다 고 가정 하면 우 리 는 이 차원 이 시간 을 대표 한다 고 가정 합 시다. 그 시간 = 0, 높이 = 0, 길이 = 0, 너비 = 0 의 요 소 를 메모리 의 0 번 째 위치 에 두 면 시간 = 1, 높이 = 0, 길이 = 0, 너비 = 0 의 요 소 는 0 + bound [1] * bound [2] * bound [3] 라 는 위치 에 두 어야 합 니까?이것 이 바로 A. constants [i] = A. bounds [i + 1] * A. constants [i + 1] 이다.이 공식의 내력.물론, 나 는 단지 아주 간단하게 설 명 했 을 뿐이다. 많은 세부 사항 은 네가 스스로 고려 해 야 한다. 왜냐하면 언어 표현 이 너무 복잡 해서 어떻게 표현 해 야 할 지 모르겠다.사실 A. constants [i] = A. bounds [i + 1] * A. constants [i + 1] 를 자세히 보 세 요.,이것 은 전달 공식 입 니 다. 그것 을 펼 치면 다음 에 저 는 constants [i] 를 coni, bounds [i] 를 boni 로 간략하게 쓰 겠 습 니 다. 그러면 con i = bon [i + 1] * con [i + 1] = bon [i + 1] * bon [i + 2] = bon [i + 1] * bon [i + 3] * con [i + 3] = bon [i + 1] * bon [i + 2] * bon [i + 3] *... * bon [im] 이 공식 을 보 세 요. 위 에서 말 한 높이 * 길이 * 너비 에 해당 하 는 것 아 닙 니까?아까 그 bon [dim] 은 bon [dim - 1] 이 라 고 써 야 되 는데 이 건 이해 에 영향 을 주지 않 아 요.
그리고 우 리 는 마지막 1 차원 을 봅 니 다. 예 를 들 어 위의 예 의 너비, 너비 + 1 이 바로 메모리 주소 + 1 이 아 닙 니까?따라서 너비 라 는 마지막 차원 에 대응 하여 매번 주 소 는 + 1 만 있 으 면 다음 요 소 를 방문 할 수 있 기 때문에 bon [dim - 1] 즉 마지막 1 차원 입 니 다. 그렇지 않 으 면 1 과 같 아야 합 니까?
읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다. 본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.