1580, 8/79 회원가입  로그인  
   han0161
   배열

http://www.hackerschool.org/HS_Boards/zboard.php?id=Free_Lectures&no=747 [복사]


배열(array)
C에서 배열을 아주 단순한 구조로 정의 하였다.
연속된 메모리 공간을 차지하는 같은 데이터형들의 집합이 그 정의이다. 그 이상도 그 이하도 아니다.
우선 배열은 정적인 데이터형이다. 소스 코드 상에서 반드시 그 크기를 미리 정해두어야 한다는 말이다. 컴파일러는 이 정해진 크기만큼 공간만을 확보하지 그 이상의 조치는 하지 않는다.
정의
데이터형 배열명[배열의 크기];
ex) int array[10];
위와 같이 정의되었을 때 array라는 배열 이름은 단 두 가지의 의미 밖에 없다. 첫째는 array라는 배열명은 10개의 정수가 저장된 공간의 선두 번지를 의미하는 것이고, 둘째로 sizeof(array)와 같이 하면 배열의 크기, 즉 int형이 몇 개나 저장될 수 있는가 하는 10이라는 값을 나타낼 뿐이다.  그 이외의 배열에 대한 조작은 모두 포인터의 조작으로 대치된다.
C에서는 배열의 어떠한 첨자의 검사도 하지 않는다. array[-1]같은 것들도 에러를 내지 않는다. 이점은 C에서 배열을 다루는 방법에 의한 것이며 이 같은 점이 초보자에게는 굉장한 혼란을 줄 수 있지만 이것도 C의 융통성에 포함되는 것이다.
배열의 첨자에 대한 처리는 포인터에 대한 처리로 대치 된다.
array[4]와 같은 것은 *(array+4)와 완전히 동일하다.
1차원 배열
배열의 차수는 배열 요소를 지정하는데 몇 개의 첨자가 필요하느냐에 의해서 결정된다.
생성동시에 초기화 할 수 있다.
int array[10]={1,2,3,4,5,6,7,8,9,0};
다차원배열
다차원 배열은 각 배열 요소를 지정하는데 여러 개의 첨자 요소가 쓰이는 배열을 말한다.
보통 2차원과 3차원 배열이 많이 쓰이고 그 이상은 사용이 드물다.
int array2[3][3] = {{1,2,3},{4,5,6},{7,9,8}};
앞에 첨자는 행을 나타내며 뒤에 첨자는 열을 나타낸다.
그러나 메모리에 올라갈 때는 메모리가 선형 구조기 때문에 마치 1차원 배열처럼 저장이 된다. 1,2,3,4,5,6,7,8,9,0 이런 식으로 저장이 된다.
배열의 제일 처음공간을 주소라고 했는데 array2+1를 하면 2를 가르치는 것이 아니라 4를 나타낸다. array2는 3개의 int형 공간을 가르키게 된다.
C의 문법은 완전히 재귀적 이라는 것을 생각하면 2차원 배열이 이런 복잡한 구조를 갖는다는 데에 수긍이 갈 것이다.
1차원 배열을 함수의 인자로 넘기는 방법
int average(int a[],int n)
{
   int sum=0;
   int i;
   for(i=0; i < n;i++)
      sum+=a[i];
   return (sum/n);
}
C에서 배열의 크기는 메모리 공간을 할당할 때만 필요하지 실행시에는 배열의 크기에
대해서 컴파일러가 신경써주지 않는다. 그래서 함수가 배열을 인자로 받을 때 그배열이 몇 개의 요소를 가지는지는 전혀 알 방법이 없다. 이런 유로 average()함수는 n이라는 배열의 크기를 인자로 따로 받는다. 그리고 인자로 받는 배열 a에도 []로 배열표시만 했지 크기를 명시하지 않음을 알 수 있다.(크기를 명시해도 컴파일러는 이것을 무시한다.)
물론 배열 자체에 배열의 끝을 나타내는 요소가 있으면 배열의 크기를 넘길 필요가 없다.
가장 구체적인 예가 바로 문자열을 다루는 방식이다. 문자열 끝에는 NULL 문자가 끝에 붙어 있기 때문이다. 배열을 읽어 가다가 NULL이 읽어지면 배열의 끝임을 알게 되는 것이다.
int average(int *a, int n) //포인터로 표현
2차원 배열을 함수의 인자로 넘기는 방법
2차원 배열을 함수의 인자로 넘기는 방법은 주의를 요한다. C는 프로그램이 실행한 뒤에는 배열의 크기를 모른다고 하였기 때문에 1차원 배열에서는 함수의 인자로 배열을 넘길 때 배열의 크기를 명시하지 않고 따로 배열의 크기를 정수로 넘겨주었다.
하지만 2차원 배열은 얼핏보면 그 원칙에 어긋나는 것 같다.
2차원 배열은 얼핏보면 그 원칙에 어긋나는 것 같다.
2차원 배열을 사용하는 가장 빈번한 예는 행렬이다. 다음의 input_matrix() 함 수는 2*2 행렬을 키보드로 입력 받는 함수이다.
void input_matrix (int m[][2],int n)
{
   int i, j;
   printf(“\n input %d by %d Matrix in row order ->”,n,n);
   for (i=0; i<n ; i++)
        for(j=0; j<n; j++)
              scanf(“%d”,&m[i][j]);
}
배열의 크기를 모른다고 했는데 위의 input_matrix() 함수의 인자에는 int m[][2]라고 쓰여 있어 2라는 크기가 들어갔음을 알 수 있다.
m을 포인터라고 보았을 때 int m[][2]의 표현은 m이 두 개의 int형의 공간을 가리키는 포인터이다. 즉 m[][2]의 표현은 배열의 크기를 나타낸 것이 아니라 m이 어떤 형의 데이터를 가리키는 포인터인지 나타내는 것이다.
이것을 포인터로 표현하면
void input_matrix(int *(m[2]),int n)
포인터로 표현하니 더 의미가 명확하다. 2개의 int 공간을 가리키는 포인터 m의 정체가 학연히 드러난다.
다차원 배열을 함수의 인자로 넘기는 방법
다차원 배열은 2차원 배열을 함수의 인자로 넘기는 방법의 연장선상에 있다. 즉 다차원 배열을 함수의 인자로 넘길 때에는 2차원 배열과 마찬가지로 가장 큰 블록을 가리키는 최좌측 첨자를 비워두고 나머지 첨자는 그 크기를 명시하는 것이다.
int tri[3][4][2];
int func(int t[][4][2])
{
……….
}

  Hit : 5491     Date : 2007/06/14 09:36
[불법/스팸글로 신고하기]



    
jin1055 공포의 배열;;이거 대체 어디다 써먹는 거지...?? 2007/06/21  
1440   방화벽 설명 입니다.[2]     oldlove7
08/17 6769
1439   바이러스 만들기[8]     akwjs566
03/31 7761
1438   바이러스 종류[11]     akwjs566
04/11 5751
1437   배열 내에서 랜덤한 n개 추출하기[2]     kjwon15
12/05 10318
  배열[1]     han0161
06/14 5490
1435   백도어를 하실줄 아시는 분[6]     hacs98
05/03 6483
1434   백도어란??(이거 맞나요??)[4]     H.R.T
12/13 9183
1433   백트랙의정석 제2-1강[5]     인천해커
01/21 11524
1432   백트랙5 사용법/자세히좀 알려주세요[3]     cswcys
09/20 33109
1431   백트랙 설치방법 2     hacs98
05/05 6003
1430   백트랙 설치방법     hacs98
05/05 6407
1429   백트랙 잘하시는 분 찾습니다[1]     hacs98
05/05 6018
1428   메모리 덤프(블루 스크린=STOP 스크린) 코드 및 해결[1]     ROK.AF
02/09 10521
1427   막 간지나게 해킹하고싶어요[13]     dldvk9999
10/11 31603
1426   리버스엔지니어링 잘하시는분..?     pcw0629
08/26 3748
1425   리버스 엔지니어링 (어셈블리) -1     salangi11
02/21 5327
1424   리버스 엔지니어링 [1]     festal
09/24 6217
1423   리버싱 기초 지식 정리해봤습니다.[1]     libera826
12/25 4926
1422   리버싱 직접 공부하실수 있게 해드립니다.[1]     xellos1234
01/07 3344
1421   리모트에서 명령어 실행시키기[1]     xiangyi
02/03 8923
[1][2][3][4][5][6][7] 8 [9][10]..[79]

Copyright 1999-2021 Zeroboard / skin by Hackerschool.org / Secure Patch by Hackerschool.org & Wowhacker.com