제가 대학교 1학년 때 C언어 수업에서 배운 내용을 교재와 ppt를 중심으로 정리한 내용입니다. (2022.3 ~ 2022.6)
당시에 공부를 위해서 HWP 파일로 정리해 놓은 것을 그대로 올립니다.
대학에 처음 들어와 정리한 내용이라 모든 내용을 담고 싶은 욕심에 정리가 많이 지져분하고 어설픈점 양해 부탁드립니다..!
🍑배열의 기본
배열의 필요성
배열의 개념
배열 : 같은 데이터형의 변수를 메모리에 연속적으로 할당하고 같은 이름으로 사용하는 기능.
원소 : 배열안의 변수 하나하나
- 배열의 각 원소도 변수이지만, 일반 변수와 다르게 항상 연속된 메모리에 할당. (변수라면 각각 값을 저장할 메모리 공간이 할당됨 → 독립적 변수로 사용 가능)
인덱스(첨자) : 배열의 원소를 구분하기 위한 번호
0부터 시작
배열이름[인덱스] 와 같은 방식으로 배열의 원소를 구분
배열의 이름
- 배열 전체에 대한 이름이 됨.
- 배열의 원소를 개별적 변수로 이용하기 위해서는 배열이름과 인덱스를 함께 이용해야함.
배열의 선언
데이터형 배열명[크기] 형식으로 배열의 크기 지정.
- 원소가
n개인 type형 배열을 선언하면 type형의 변수 n개를 메모리에 연속적으로 할당.
- 할당 메모리의 크기는
sizeof(type) x n 바이트임.
- 배열의 크기는 반드시
0보다 큰 정수형 상수로 지정해야하고 생략 불가.
- 컴파일 시점에서 배열의 크기가 얼마인지 정해져야 하기에 → 그래서 변수도 불가
const 변수 불가(컴파일 에러).
- 메크로 상수 가능.
sizeof(arr) : arr 배열 전체의 바이트 크기
sizeof(arr[i]) : arr 배열 원소의 바이트 크기
sizeof(arr)/size(arr[0]) : arr배열의 크기 = 원소의 개수
int size = sizeof(arr)/size(arr[0]) 의 사용 이유
- 코드에서 배열의 크기가 이용되는 경우, 배열의 크기를 변경해도, 코드를 수정할 필요없음.
- 대신에 메크로 상수 이용가능.
배열의 초기화
-
데이터형 배열명[크기] = {초기값목록}; 형식으로 초기화
-
{} 안에 나열된 초기값은, 배열의 0번째 원소부터 순서대로 초기화하는데에 사용.
- 배열의 크기보다 초기값을 부족하게 지정 → 나머지 원소는 0으로 초기화.
- 배열의 크기보다 초기값을 많이 지정 → 컴파일 에러
-
{}를 사용할 때는 반드시 초기값을 하나 이상 지정해야함
-
배열 전체를 0으로 초기화 하려면 { 0 }
-
배열의 초기값을 지정하는 경우 크기를 생략할 수 있음
배열의 사용
- 배열의 원소도 변수이기에
type형 배열의 원소는 type원소가 사용되는 모든 곳에서 사용가능.
- 배열의 원소에 대입, 수식에 이용, 값 입력 받기, 배열의 원소를 함수의 인자로 전달 가능.
- 배열의 인덱스에는 변수나 변수를 포함한 수식 사용 가능. 다만, 수식의 값은 정수여야함.
- 잘못된 인덱스의 사용 → 사용시에도 컴파일에러가 발생하지 않으므로 주의해야함
- 인덱스의 유효범위는 [0 ~ (배열의 크기 - 1)] 임.
- 유효범위를 넘어서는 인덱스를 읽어오려하면 쓰레기값을 읽어옴.
- 유효범위를 넘어서는 인덱스에 값을 저장하려하면 엉뚱한 변수의 값이 변경되거나, 프로그램 강제 종료 (실행 에러 →
runtime check failure #2) 프로그램이 죽거나 오작동하는 원인.
배열의 복사 : 배열의 모든 원소에 대해 원소끼리 대입하는 것
- 데이터형과 크기가 같은 경우에도 배열에 다른 배열 대입 불가.
- 배열의 이름으로 배열 전체 대입 불가.
- 배열 복사시 배열의 모든 원소에 대해 배열의 원소끼리 대입해야함. (for문 활용해서 1:1 대입)
배열의 비교
== 연산자로 직접 배열을 비교하면 배열의 시작 주소를 비교.
(배열의 이름 = 배열의 시작 주소)
- 배열의 내용 비교를 위해서는
for문을 이용해서 원소끼리 비교해야함.
- 모든 원소의 값이 같으면, 배열 전체의 내용이 동일하고, 하나라도 다르면 다름.
🍑다차원 배열
다차원 배열의 개념
- 원소에 접근 시 2개의 인덱스를 사용.
- 행렬이나 표, 폭과 높이가 있는 이미지 데이터 등을 나타내는데 이용.
- 2차원 배열은 행( ㅡ )과 열( | )의 개념으로 이해.
- ex) 점수 3개를 저장하는 배열 5개가 필요(점수 3개 x 학생 5명)
- 다차원 배열의 차수엔 제한이 없음.
2차원 배열의 선언 및 사용
데이터형 배열명[행크기][열크기] 형식으로 선언.
- 2차원 배열의 원소도 메모리에 연속적으로 할당.
arr[0][0], arr[0][1] .... 순으로
- 2차원 배열의 원소에 접근할 때는 인덱스를 2개 사용.
열 인덱스 먼저 증가, 그 다음 행 인덱스 증가
- ex)
arr[0] = arr[0][i]전부를 지칭.
- 2차원 배열은 중첩된
for와 함께 사용 가능.
- 바깥
for로 행 인덱스, 안쪽 for로 열 인덱스를 증가시키면, 2차원 배열의 원소가 메모리에 할당된 순서대로 접근 가능.
2차원 배열의 초기화
- 2차원 배열 초기화시 초기값을 열 크기의 개수만큼
{ } 로 묶어서 다시 { } 안에 나열.
{ {값1, 값2} , {값3, 값4} } 형식으로 작성하며 콤마가 필요.
- 1차원 배열처럼
{ } 안에 값만 나열 가능
- 메모리에 할당된 순서대로 초기화.
- 초기값 생략시 나머지 원소를
0으로 초기화.
- 2차원 배열 초기화시, 배열의 행 크기를 생략 가능, 열 크기는 생략 불가.(컴파일 에러)
🍑배열의 활용
함수의 인자로 배열 전달
배열을 매개변수로 갖는 함수의 정의
- 함수의 매개변수로 배열 선언 시 배열의 크기는 생략.
- 함수 내에서 배열의 크기가 필요시 매개변수로 받아옴.
- 함수 안에서 배열의 크기를 직접 상수로 지정할 수도 있지만 다양한 크기의 배열을 출력할수 있게 하려면 매개변수로 받아오는 것이 좋음.
- 함수의 매개변수로 배열의 선언시 배열의 원소형, 매개변수명(배열명)과
[]를 적어줌.
- 배열의 크기를 전달받기 위한 별도의 매개변수 필요.
- 배열의 크기는 정수이기에
int형의 매개변수를 선언.
- 함수 안에서 배열의 크기가 필요할 때는 매개변수로 전달받은 배열의 크기 이용
배열을 매개변수로 갖는 함수의 호출
- 배열의 이름과 배열의 크기를 인자로 전달
- 이때, 매개변수의 원소형과 인자로 전달하는 배열의 원소형이 동일해야함.
- 배열의 이름이 아닌 배열의 원소 전달 시 인자와 매개변수의 데이터형이 다르기에 컴파일 경고 발생 →
[ ] 없이 배열의 이름만 작성.
- 항상 매개변수로 전달받은 배열의 크기를 이용
- 배열의 실제 크기와 다른값을 함수의 인자로 전달시에도 → 넘칠 때, 부족할 때 비교
- 매개변수의 원소형과 인자로 전달하는 배열의 원소형이 동일해야함.
배열의 탐색과 정렬
- 배열의 탐색 : 탐색 키와 같은 값을 가진 원소를 찾음.
- 탐색 or 검색 : 주어진 데이터 집합에서 조건이 만족하는 데이터를 찾는 것.
- ex) 검색할 상품명을 입력하면 여러 쇼핑몰의 상품 정보 중에서 상품명이 일치하는 항목을 찾아서 화면에 표시하는 기능
탐색 알고리즘
1. 순차 탐색 : 배열의 0번째 원소부터 순서대로 탐색키와 비교해서 값이 같은 원소를 찾음.
2. 이진 탐색 : 배열을 정렬한 상태에서 탐색.
- 빠른 탐색 가능.
bsearch 함수 → <stdlib.h>헤더
- 배열의 정렬 : 원소들을 비교해서 크기가 커지는 순서 또는 작아지는 순서로 나열
- 정렬 : 주어진 데이터 항목을 지정된 순서로 나열하는 것
- ex) 가격 비교 사이트에서 검색 결과로 표시된 상품 목록을 낮은 가격 순으로 보거나 높은 가격 순으로 확인하는 기능
- 오름차순 : 크기가 커지는 순서
- 내림차순 : 크기가 작아지는 순서
정렬 알고리즘
1. 선택 정렬
- 전체 배열의 원소 중 가장 작은 값을 선택해서 배열의
0번 원소로 옮기고, 그 다음 작은값을 선택해서 배열의 1번 원소로 옮기는 식으로 진행.
2. 퀵 정렬
qsort함수 → <stdlib.h> 헤더파일 필요.
- 가변 길이 배열이
c99 표준에서 추가.
- vs2019에서는 지원x.
- 가변 길이 배열 : 배열의 크기를 컴파일 타임에 정하지 않고 실행 타임에 정할 수 있도록 하는 기능.