일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 포인터
- raw data
- Data Science
- 백준
- Object Oriented Programming
- 티스토리챌린지
- predictive analysis
- 반복문
- 파이썬
- pointer
- assignment operator
- function
- C++
- Deep Learning
- baekjoon
- OOP
- Pre-processing
- const
- 오블완
- pass by reference
- Class
- vscode
- array
- 배열
- 문자열
- 함수
- 알고리즘
- Python
- string
- programming
- Today
- Total
Channi Studies
[C++] 배열 (Array) 본문
Modern C++에서는 주로 배열보다는 벡터를 사용합니다.
배열에는 여러가지 특징이 존재합니다.
대표적인 특징 여러가지를 소개해드리겠습니다.
1. 배열의 모든 요소들은 같은 데이터 타입이여야 합니다.
int my_arr[] {30, 50, 'a', "Ricky"} // 🚫🚫🚫 오류 발생
int my_arr[] {30, 50, 100, 300000} // Good
char my_arr[] {'a', 'c', 'q' ,'h'} // Good
2. 배열의 크기는 고정되어 있습니다. (배열의 요소의 총 숫자는 선언 이후 변화할 수 없습니다.)
그에 반해, 벡터는 크기가 가변적입니다.
3. Array 사용 중 인덱스 초과에 대한 검사가 존재하지 않습니다.
즉, array의 크기를 3으로 선언하고 3 이상의 index에 대해 출력을 하려고 하면,
오류는 발생하지 않지만 random garbage data가 출력됩니다.
4. 배열의 이름은 [index 0]번째 요소의 위치를 나타냅니다.
배열은 선언하고 이름을 출력하면 어떠한 16진수 숫자가 나옵니다.
이것이 바로 해당 배열이 저장된 위치, 즉 index 0번째 값이 저장된 위치입니다.
여기서 더욱 나아가서, [index]는 그 배열의 시작점에서 부터의 offset을 나타냅니다.
즉, index가 1이면 배열의 시작점(아까의 16진수 값)에서 1만큼 offset된 위치에 저장된 데이터를 나타냅니다.
여기서, C++는 sizeof() 함수를 통해 해당 배열의 비트 값을 이해하기 때문에,
offset이 1이라고 숫자 1만큼 떨어졌다는 뜻이 아닙니다.
편의상 특정 int 배열의 numbers의 첫번째 값의 데이터상 위치가 1000이라고 가정을 해봅시다.
int numbers[5] {10, 20, 30, 40, 50}
값들의 인덱스는 각각 10→0, 20→1, 30→2, 40→3, 50→4 입니다.
여기서 첫번째 값인 10의 위치가 인덱스 0, 즉 1000이니까,
20은 1000에서 1 offset의 값을 가진 위치, 30은 2의 위치 40은 3의 위치, 50은 4의 offset의 값을 가진 위치에 존재합니다.
여기서, sizeof(int) = 4, 즉 정수 데이터는 4바이트 메모리를 차지하기 때문에,
1000, 1001, 1002, 1003, 1004, 1005의 위치가 아니라,
1000, 1004, 1008, 1012, 1016 의 위치에 각각 값이 저장될 것입니다.

c++는 sizeof 함수를 통해 배열의 타입의 byte 크기를 이해하기 때문에,
배열의 자료형이 다를 때에는 같은 offset, 즉 같은 index에 대해서도 다른 데이터 위치에 있는 값을 적절하게 접근합니다.
가령 자료형이 정수가 아닌 double이였다면, (double은 8 bytes를 차지합니다)
1000, 1008, 1016, 1024, 1032의 위치에 데이터들이 저장되어 있을 것입니다.
* 데이터가 무조건 1000에 저장된다는 뜻이 아니고, 이해를 위해 첫번째 값이 1000에 저장된다고 가정한 것입니다.
또한, 예시에서 1000~ 1016의 위치에 데이터가 배정되었다고 해서, 그 미만 혹은 초과하는 위치에는 데이터가 없는것이 아닙니다.그렇기 때문에 3번 규칙에서 처럼 초과된 index를 출력하면 전혀 연관없는 garbage data가 출력되는 것입니다.
C++에서도 물론 2차원 배열을 사용할 수 있습니다.
2차원 배열도 동일하게 선언과 동시에 초기화를 할수도, 하지 않을수도 있습니다.
int movie_rating [3][4];
// or
const int rows {3};
const int cols {4};
int movie_rating [rows][cols];
// or
int movie_rating [3][4]
{
{3, 3, 1, 5},
{1, 5, 5, 3},
{2, 4, 4, 2}
};
'C++ > 기타' 카테고리의 다른 글
[C++] 정수끼리의 나눗셈 (0) | 2023.12.07 |
---|---|
[C++] Increment/Decrement Operator (증감연산자) ++, -- (0) | 2023.12.07 |
[C++] Assignment Operator (할당 연산자), = (0) | 2023.12.06 |
[C++] 상수(constant) (0) | 2023.12.05 |
[c++] using namespace std; (0) | 2023.12.05 |