Delphi - 배열 상세 정보

5173 단어 Delphi
기술 교류, DH 설명.
우선 우리는 무엇이 수조인지 알아야 한다.수조는 같은 특성 데이터의 집합이다. 즉, 모든 원소의 유형은 반드시 같아야 한다. 물론 다른 약한 문법의 언어에서 수조의 원소는 매우 기괴할 수 있다.예:
Var

  A: Array[ 0..2 ] Of Integer ;

Begin

  A[ 0 ] := 1 ;

  A[ 1 ] := 1.0 ; //     ,          Integer  

End ;

 
Delphi 중수 그룹 분류: 1 고정 길이와 부정 길이.정장수조: 즉 길이는 성명할 때 확정되고 뒤에는 바꿀 수 없다. 그러나 정장수조에서 시작 번호는 0부터 시작하지 않고 스스로 정할 수 있다.예를 들면 다음과 같습니다.
Var

  A: Array[ 2..3 ] Of Integer ;

Begin

  A[ 2 ] := 1 ;

  SetLength(A,3);//     ,         

End ;

 
위에서 우리는 시작 번호가 2인 것을 볼 수 있지만, 보폭은 1이므로 바꿀 수 없다.왜 우리는 많은 그룹의 시작 번호가 모두 0인 것을 보았습니까?습관일 뿐이야.모두들 화장실에서 쉬쉬하는 것에 익숙하지만, 너 혼자서 광장에서 쉬쉬하는 것에 익숙하면, 모두들 너를 문명하지 않다고 말할 것이다.하지만 처음부터 다들 광장에서 쉬쉬했다면 징그럽다고 말하지 않았을 텐데.특수한 용법을 살펴보자.
type

  THuangJacky = (hjA,hjB,hjC);

const

  //  1

  B:array[0..2] of string= ('A','B','C');

  //  2

  C:array[THuangJacky] of string= ('A','B','C');

Var

  H:THuangJacky;

  S:string;

Begin

  S:=B[Ord(H)];

  S:=C[H];

  //B[H]   C[1]    

End ;

 
용법1과 용법2는 그런 걸 쓰면 시원할 것 같아요?위의 예에서 알 수 있듯이 서수 유형이라면 모두 수조의 번호가 될 수 있다.그러나 우리가 사용할 때 번호는 반드시 성명된 그런 번호 유형이어야 하기 때문에 위의 코드 주석에서 두 가지 잘못된 상황을 쓸 수 있다.부정확한 장수조: 동적 수조, 즉 성명할 때 길이가 얼마인지 말하지 않고 사용하기 전에 반드시 성명해야 하며 길이는 재분배할 수 있다.번호는 0부터 시작해야 합니다.간단한 예를 보다.
Var

  A: Array Of Integer ;

Begin

  SetLength( A, 3 ) ; //     3   

  A[ 0 ] := 1 ;

  A[ 1 ] := 2 ;

  A[ 2 ] := 3 ;

  //A[3]   ,    ,       ?    ,              

  SetLength( A, 4 ) ; //      ,         

  A[ 3 ] := 4 ; //     .

  SetLength( A, 3 ) ; //      ,        

  // A[3]     

End ;

 
때때로 모두가 이렇게 하려면 먼저 길이를 설정한 다음에 값을 매겨야 하는데, 매우 번거롭지 않습니까?단숨에 이루어지는 느낌이 없다.그래, 다시 한 번 말해 보자.
Type

  TA = Array Of Integer ;

Var

  A: TA ;

Begin

  A := TA.Create( 1, 2, 3 ) ;

  //     D7    

  //  A[0]:=1,A[1]:=2,A[2]:=3

End ;

 
2차원과 다차원.앞의 모든 예에서 우리는 단지 1차원 그룹을 말했을 뿐인데, 지금 우리가 행렬 (다차원 그룹) 을 만들고 싶다면 어떻게 합니까?
Var

  A: Array [0.. 2, 0.. 2] Of Integer;

  B: Array [0.. 2] Of Array [0.. 2] Of Integer;

Begin

  A[0, 0]:= 1;

  A[0][0]:= 1;

End;

두 가지 방법 다 괜찮아요.
Var

  B: Array Of Array Of Integer;

Begin

  SetLength(B, 3, 3); // 3*3  

  //          ,     

  SetLength(B, 3);

  SetLength(B[0], 1); // *

  SetLength(B[1], 2); // **

  SetLength(B[2], 3); // ***

End;

 
다음은 수조에서 자주 사용하는 함수 몇 가지를 말해 봅시다. 첫 번째 복제 수조.
Var

  A, B: Array [0.. 1] Of Integer;

Begin

  A[0]:= 1;

  A[1]:= 2;

  B:= A;

  B[0]:= 2;

  ShowMessageFmt('A0:%D,B0:%D', [A[0], B[0]]); // A0:1,B0:2

End;

이 효과는 바로 우리가 원하는 것이다. 무슨 할 말이 없는 것 같다.동적 그룹이라면?
Var

  A, B: Array Of Integer;

Begin

  SetLength(A, 2);

  SetLength(B, 2);

  A[0]:= 1;

  A[1]:= 2;

  B:= A;

  B[0]:= 2;

  ShowMessageFmt('A0:%D,B0:%D', [A[0], B[0]]); // A0:2,B0:2

End;

이제 어떡하지?A와 B는 하나의 주소에 연결되어 있습니다. 사실 현재 우리는 Copy 함수를 사용할 수 있습니다. 맞습니다. 바로 문자열을 복사하는 함수입니다.
Var

  A, B: Array Of Integer;

Begin

  SetLength(A, 2);

  SetLength(B, 2);

  A[0]:= 1;

  A[1]:= 2;

  B:= Copy(A); //          

  B:= Copy(A, 0, 2); //      

  B[0]:= 2;

  ShowMessageFmt('A0:%D,B0:%D', [A[0], B[0]]); // A0:1,B0:2

End;

두 번째 번호 관련 함수인 Low () 와 High () 는 신뢰할 만하지만, 우리가 주의해야 할 것은, 그들이 되돌아오는 유형은 우리 그룹의 번호의 그 유형이고, 모두 Integer가 아니다. 예를 들어 앞의 예에서THuangJacky와 같다.
var

  A : array of array of string;

  I, J : Integer;

begin

  SetLength(A, 10);

  for I := Low(A) to High(A) do

  begin

    SetLength(A[I], I);

    for J := Low(A[I]) to High(A[I]) do

      A[I,J] := IntToStr(I) + ',' + IntToStr(J) + ' ';

    end;

  end;

세 번째 수조 길이Length() 함수가 되돌아오는 것은 틀림없이 Integer일 것이다. 왜냐하면 개수는 정수가 아니기 때문에 반 개가 더 있겠는가?
Var

  A: Array Of Integer;

Begin

  SetLength(A, 2);

  Length(A); //   2

End;
 

마지막으로 질문을 하면 나는 말하지 않겠다. 위의 그 복제된 예에서 우리는 무엇을 알아낼 수 있습니까?정장수 그룹 변수는 하나의 변수이기 때문에 직접: = 로 값을 부여할 수 있고 동적 수 그룹 변수는 하나의 지침이다. 만약에: = 로 값을 부여하면 두 변수가 함께 연결된다.
Var

  A: Array [0.. 2] Of Integer;

  B: Array Of Integer;

Begin

  ShowMessageFmt('A:%8x,A[0]:%8p', [Integer(@A), @A[0]]); //   ,               

  SetLength(B, 3);

  ShowMessageFmt('B:%8p,B[0]:%8p', [B, @B[0]]); //   ,          

End;

우리는 A가 주소를 찾아야 A[0]와 주소를 찾는 것을 보았다. 그러면 A가 바로 A[0]이다.B는 바로 B[0]가 주소를 찾는 것과 같다. 즉, B가 바로 B[0]의 주소다.
수조의 메모리에서의 분포: 연속적으로 분포하고 간격은 모든 원소의 크기이다.
Var

  A: Array [0.. 2] Of Integer;

  B: Array Of Integer;

Begin

  A[1]:= 123;

  //  A   A[0]         4      A[1]

  ShowMessageFmt('A[1]:%D,    :%D', [A[1], PInteger(Integer(@A)+ 4)^]);

  //   ,  123

  SetLength(B, 3);

  B[2]:= 88;

  //  B   8     B[2]

  ShowMessageFmt('B[2]:%D,    :%D', [B[2], PInteger(Integer(B)+ 8)^]); //   ,88

End;

그러나 동적 수조의 구조와 문자의 구조는 매우 비슷하다.
오프셋
-8
-4
0~Length* 요소 크기 -1
컨텐트
32비트 참조
원소 개수
실속
됐어, 이만큼만 말할 수 있어. 난 이만큼만 이해했어.
DH입니다.

좋은 웹페이지 즐겨찾기