리메이크 중/C,C++ 이론 중심

C(&C++) 이론 16. 배열

라이피 (Lypi) 2023. 1. 6. 19:16
반응형


내용 참고

YES C (정보공학연구소/생능출판사)

혼자 연구하는 C/C++ (Soen.kr/와우북스)

Microsoft Docs (구 MSDN)


배열(Array)

■ 배열은 동일한 타입을 갖는 유한개의 변수들을 한 가지 이름으로 묶어서 메모리에 순서대로 저장해 놓은 것이다.

■ 배열 내의 변수에 순서대로 접근하기 위한 숫자를 인덱스(Index)라고 부른다.

■ 인덱스가 n개라면 n차원 배열이라고 한다.

■ 예를들어 arr[10][10][10]은 인덱스가 3개이므로 3차원 배열이라고 한다.


Ⅰ. 배열의 선언

ⅰ. 배열의 길이

■ 배열을 선언할 때는 반드시 배열의 길이를 명시적으로 설정해야한다.

■ 배열의 길이는 변수로 정할 수 없으며, 반드시 상수 혹은 상수 표현식(constexpr)으로 지정해야한다.

■ 배열의 길이 값은 1이상의 정수만 가능하다.

■ 컴파일러는 배열이 처음 선언되었을 때 그만큼의 메모리를 예약하기 때문에 길이를 바꿀 수 없다.

■ 배열과 비슷하지만 길이가 자동으로 변하고 중간에도 값을 삽입할 수 있는 자료구조로 STL의 vector가 있다.

ⅱ. 배열 선언하기

■ 기본적으로 배열은 데이터타입 배열이름[인덱스]([인덱스]...);의 형태로 선언한다.

■ 예를들어 int형 2차원 배열은 int arr[10][10];의 형태로 선언한다.

■ 배열을 구성하는 데이터타입은 기본자료형뿐 아니라 사용자 정의 자료형 등도 가능하다.

■ 혹은 초기화리스트를 이용해서 데이터타입 배열이름[] = {초기화 리스트};의 형태로 선언할 수도 있다.

■ 예를들어 int arr[] = {1,2,3,4};의 형태로 선언하면 크기가 4인 int형 배열이 선언된다.

■ 초기화리스트를 이용하여 2차원 이상의 배열을 선언하고 싶다면 int arr[][] = {{1,2},{3,4}};와 같이 초기화 리스트를 작성한다.

■ 2차원 이상의 배열은 그만큼의 차원을 갖는 좌표 평면으로 이미지하는 것이 좋지만 메모리에는 선형으로 저장된다.

■ C(&C++)의 배열은 내부적으로는 1차원 배열이기 때문이다. 2차원 배열은 1차원 배열의 배열이다.

■ 즉, int arr[2][2] 라는 배열에 {{0,1},{2,3}}이 저장되어 있다고 할 때,

■ 0의 메모리 값이 0이라면 마지막 값이 3의 메모리 값은 13 (4*3 + 1) 이다. 

 

 


Ⅱ. 배열의 초기화

ⅰ. 배열 초기화 하기

■ 배열을 생성하고 초기화하지 않으면 메모리에는 쓰레기값이 들어가있게 된다.

■ 배열은 (1)과 같이 반복문을 사용해서 개별 변수 하나하나에 값을 대입하는 방식으로 초기화할 수 있다.

■ 혹은 (2)와 같이 초기화리스트를 이용해서 초기화 할 수도 있다.

// ... (1)
int arr1[5];
for(int i = 0; i < 5; i++) {
	arr[i] = 0;
} 

// ... (2)
int arr2[5] = {0, 0, 0, 0, 0};

// ... (3)
int arr3[5] = {1};

■ 초기화리스트를 이용한 초기화는 배열을 처음 생성했을 때만 가능하다.

■ 만약 (3)과 같이 배열의 크기보다 초기화리스트의 항목 수가 적을 경우 앞에서부터 채우고 뒤는 0으로 초기화된다.

■ 그러므로 int arr4[100] = {0}; 이라고 선언할 경우 모든 항목이 0으로 초기화된다.

■ 자동으로 채워지는 값은 정수형 배열은 0, 실수형 배열은 0.0, 문자형 배열은 '\n'(널문자), 포인터형 배열은 null포인터이다.


Ⅲ. 배열의 특징

ⅰ. 특징

■ C와 C++의 배열 첨자(index)는 0부터 시작한다. 그러므로 길이가 n인 배열의 인덱스는 0~n-1까지 존재한다.

■ 예를들어 int arr[5]라는 배열의 인덱스는 arr[0] ~ arr[4]까지 존재한다.

■ 배열의 크기는 (데이터 타입의 크기 * 배열의 길이)이다. 

■ 즉, int  arr[5]라는 배열의 크기인 sizeof(arr)은 sizeof(int) * 5와 같다. sizeof(int)가 4라면 20이다.

■ 배열의 길이는 한번 선언되면 바뀌지 않지만 함수 등에서 사용할 때 상수 값을 넣는 것은 위험할 수 있다.

■ 이럴 때는 배열의 길이를 sizeof(arr)/sizeof(int)로 구해서 사용하는 편이 안전하다.

■ 배열의 이름은 배열의 첫번째 요소에 대한 포인터이다.

■ 하지만 sizeof() 연산자에서 배열 이름을 넣으면 배열 전체의 크기를 반환한다.


 

반응형