Delphi - 배열 상세 정보
5173 단어 Delphi
우선 우리는 무엇이 수조인지 알아야 한다.수조는 같은 특성 데이터의 집합이다. 즉, 모든 원소의 유형은 반드시 같아야 한다. 물론 다른 약한 문법의 언어에서 수조의 원소는 매우 기괴할 수 있다.예:
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입니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[Delphi] TStringBuilder그리고 꼭 사용해야만 할까? 그림처럼 Heap 영역에 "Hello" 공간을 생성하고 포인팅을 한다. "Hello World" 공간을 새로 생성한 후 포인팅을 하게 된다. 결국 "Hello" 라는 String 객체가 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.