C언어 복습

C언어 복습 15 (배열)

Captic 2019. 6. 30. 15:00

참고: 정덕 - <컴맹을 위한 C언어>

♨ 개인적 해석이 다분한 글임으로, 인지하지 못한 오류가 있을 수 있습니다 

 

▣ 배열

  동일한 종류의, 수많은 변수를 한꺼번에 선언해서 관리해야할 때 사용

 

▣ 배열의 선언

 - 배열 선언하기 변수를 만들 때 필요한 정보

   1. 어떤 자료형의 변수를 만들 것인가

   2. 어떤 이름으로 변수를 참조할 것인가

 

 - 배열을 만들 때 필요한 정보

   1. 어떤 자료형의 배열을 만들 것인가

   2. 얼마나 많이 만들 것인가

   3. 어떤 이름으로 배열을 참조할 것인가

 

 - 선언하기: 자료형 배열이름[개수];

           예) int a[1000];

 

   배열을 통해 선언한 int변수는 메모리상에서 딱 붙어서 하나의 큰 덩어리로 보인다

     -> 4바이트짜리 10개 총 40바이트가 확보된다

 

 - 배열의 한계 한계보다 많이 선언하게 되면 프로그램 실행시 에러

   -> 함수가 호출되면 메모리에 그 함수만의 영역이 확보

     but! 그 이전에 프로그램의 영역이 먼저 확보

 

 ∴ 프로그램이 쓸수 있는 영역 확보

   = main함수 영역 확보 + 기타 함수의 영역 확보

   -> 프로그램 또는 main함수가 확보한 크기 내에서 함수를 선언할 수 있다

 

  ※ 배열도 자료형이다

        double arr[10];

    위에서 선언된 배열의 자료형은 "doube의 배열"이지 "double"이 아니다 (크기가 다르다!)

 

▣ 배열 참조 연산자

 - 배열을 선언하면 각 요소에 순서대로 번호가 매겨진다(int arr[5] -> 5개의 int에 번호가 매겨진다)

   배열 내의 특정요소 참조를 원한다면 매겨진 요소의 번호를 이용, 이 번호를 "인덱스 라고 부른다

   실은 요소에 인덱스가 매겨지는게 아니라, 배열의 첫 요소에서 '인덱스'(n)칸 만큼 떨어져 있는 것을 참조한다는 의미

 

 - int arr[5]의 인덱스는

요런 식으로 입력된 순서대로 0부터 번호가 매겨진다

    각 요소를 참조할 땐 참조연산자 " [ , ] "를 이용

 

  예)  

 

 배열의 초기화

  - 다른 변수와 동일하게 배열도 선언 후 초기화를 해줘야한다

  - 1.각 요소를 일일이 초기화

      가장 단순한 방법, 너무 노동이라 비추

  - 2. 중괄호를 이용해 초기화

       중괄호를 이용한 초기화는 선언과 동시에만 가능, 선언 이후에는 불가

     2- 1. 모든 요소를 0으로 초기화

            int arr[10]={};

 

     2- 2. 전체 요소 초기화

            int arr[6]={9, 7, 1, 0, 0, 2};

        -> 중괄호 안에 모든 요소를 " , "로 구분해 나열하면 한꺼번에 초기화 가능

 

     2- 3. 일부 요소만 초기화

            float ay[5]={97.0, 16, 7, 18}

       -> 5개중 3개만 초기화 했다면 나머지 2개는 0으로 초기화

          일부 요소만 초기화 하는 것(전체 중 일부)은 처음부터 차례대로 초기화되기 때문에

          중간을 비워두고(0으로 초기화되길 기대하고) 초기화하는 것은 불가

            예- int ar[10]={,,,,,,7}; 이런거 불가

 

      2- 4. 배열 길이를 안 쓸 경우

           int today[]={2019, 1, 14};

         대괄호 안에 배열 길이를 쓰지 않은 채 중괄호 안에 요소를 나열하여 초기화했다면

         자동으로 배열의 길이가 요소의 수(위의 예시 같은 경우는 3)으로 정해진다

 

 

   - 3. 반복문을 이용해 초기화

     순서대로 정의하고 싶을 때, 사용자에게 입력을 받아 초기화하고 싶을 때에는 반복문으로 초기화

 

     3- 1. 숫자를 순서대로 넣고 초기화

 

      

   

인덱스'였던것'의 시작이 0이기 때문에 i+1로 해줘야 시작이 1이된다

 

   3- 2. 사용자의 입력을 받아 모든 요소를 초기화

      반복문 안에 scanf함수를 사용하면 각 요소를 사용자가 입력한 값으로 초기화 할 수 있다

 

 

 

 

▣ 2차원 배열이란

 - double, int와 같은 원시적인 자료형을 요소로 가지는 배열을 "1차원 배열"이라고 한다

   배열은 원시 자료형뿐만 아니라 배열을 요소로 가질 수 있다 이를 "다차원 배열"아라 한다

 - 1차원 배열은 원시 자료형을 요소로, 2차원 배열은 1차원 배열을 요소로, 3차원 배열은 2차원 배열을 요소로 갖는다

 

 2차원 배열이 필요한 이유

 - 1. 학생들의 성적 데이터 예시

 - 국, 수, 사, 과 성적 데이터를 관리하기 위해 배열을 만든다면

     float grade[4];

   450명의 학생의 성적을 이와 같은 배열로 정리하면 450개의 배열 코드가 필요

  -> 불----편

 

 이럴때 2차원 배열로 정리하면

편-----안

 - 2. 바둑판 예시

   바둑판에서 바둑돌의 위치는 좌/우에서 몇 번째, 상/하에서 몇 번째인지로 표현 할 수 있다

 

 Y좌표를 여러개 담을 수 있는 배열을 요소로 하는 배열

-> 정리

   2차원 배열은 데이터를 참조하기 위해 필요한 정보가 2가지일 때 유용

    - 1번의 예시는 ①어느 학생의 성적, ②어느 과목의 성적

    - 2번의 예시는 ①x좌표, ②y좌표

 

 2차원 배열의 선언과 참조

 - 2차원 배열의 선언

      ①자료형 ②배열이름 ③[개수1] ④[개수2];

          예) int arr[10][20]

 

  ①: 1차원 배열이 담고 있는 요소의 자료형 (int)

  ②: 배열의 이름 (arr)

  ③: 2차원 배열의 요소의 개수 (10)

  ④: 1차원 배열의 요소의 개수 (20)

 

  int arr[10][20]; = arr이라는 이름의 배열은 길이가 10인 배열이고,

                        그 요소는 길이가 20이고 int 자료형을 갖은 배열이다

 

 - 2차원 배열의 크기는 (2차원 배열의 길이)×(1차원 배열의 길이)×(자료형의 크기)

   ->위 배열의 크기는 10×20×int(4바이트) = 800바이트

 

 - 2차원 배열의 참조

   1차원 배열의 참조 방법 : ' 배열이름[인덱스 ]'

    -> 2차원 배열은 배열이 2개임으로 인덱스 번호가 2번 들어가야한다

 

 ∴ 배열이름[2차배열의 인덱스][1차배열의 인덱스] ->이 때에도 인덱스가 0부터 시작하는 것은 변함없다

 

 

 2차원 배열의 초기화

 예) int arr[2][3]을 초기화 하려고 한다

   ① int arr[2][3]={};

       초기화를 위해 중괄호를 적고 arr에 대해 선언한다

 

   ② int arr[2][3]={ 요소1, 요소2 };

        arr은 요소1과 요소2를 가진 배열이고

 

   ③ int arr[2][3]={{요소1-1, 요소1-2, 요소1-3}, 요소2};

       요소1은 요소1-1, 요소1-2, 요소1-3를 갖는 배열

 

   ④ int arr[2][3]={{요소1-1, 요소1-2, 요소1-3}, {요소2-1, 요소2-2, 요소2-3}};

      요소2는 요소2-1, 요소2-2, 요소2-3를 갖는 배열

 

   ⑤int arr[2][3]={{int1-1, int1-2, int1-3}, {int2-1, int2-2, int2-3}};

      근데 걔네는 다 int이다

 

   ⑥int arr[2][3]={{1,2,3},{4,5,6}};

     마무리

 

 - 1차원 배열과 마찬가지로 중괄호에 아무것도 넣지 않으면 전부 0으로 초기화된다

 - 반복문을 이용한 초기화도 가능, 배열이 2개니 이중 반복문 사용