C언어 복습 15 (배열)
참고: 정덕 - <컴맹을 위한 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]의 인덱스는
각 요소를 참조할 땐 참조연산자 " [ , ] "를 이용
예)
▣ 배열의 초기화
- 다른 변수와 동일하게 배열도 선언 후 초기화를 해줘야한다
- 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. 바둑판 예시
바둑판에서 바둑돌의 위치는 좌/우에서 몇 번째, 상/하에서 몇 번째인지로 표현 할 수 있다
-> 정리
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개니 이중 반복문 사용