배열의 필요성
만약 우리가 어떤 구조체 StatInfo 가 있다고 해보자. 우리가 몬스터를 100개, 1000개, 100000개 등등 심지어 갯수가 정해지지 않는 경우 우리는 그것을 하나하나 코드를 늘려가지 않을 것이다.
같은 타입끼리 묶어서 하나의 데이터 처럼 이용하는 것이 배열이다.
Type 이름[개수]; 로 선언해 사용이 가능하다.
#include <iostream>
using namespace std;
struct StatInfo
{
int hp = 0xAAAAAAAA;
int attack = 0xBBBBBBBB;
int defense = 0xCCCCCCCC;
};
int main()
{
StatInfo monsters[10];
return 0;
}
여태껏 변수들의 [이름은] 바구니의 이름이었다.
하지만 배열의 [이름]은 조금 다르게 동작한다.
즉, 다음의 경우가 허용되지 않는다.
#include <iostream>
using namespace std;
struct StatInfo
{
int hp = 0xAAAAAAAA;
int attack = 0xBBBBBBBB;
int defense = 0xCCCCCCCC;
};
int main()
{
StatInfo monsters[10];
//가능
int a = 10;
int b = a;
//불가능
StatInfo players[10];
players = monsters;
return 0;
}
그렇다면 배열의 이름은 뭐인가?
바로 배열의 이름은 곧 배열의 시작 주소이다.
정확히는 시작 위치를 가리키는 type* 포인터와 동일하다.
인덱스
배열은 0번부터 시작해, N번째 인덱스에 해당하는 데이터를 접근하려면 배열이름[N]으로 접근 가능하다.
int number[5];
number[0] = 1;...
포인터 vs 배열
우리가 자주 사용하는 "Hello, World"은 문자열이다. 문자열은 곧 문자 배열을 의미한다.
즉 const char[12] 형태 인 것이다.
포인터는 주소를 담는 바구니이다.
배열은 닭장 그 자체로 같은 데이터끼리 붙어있는 '바구니 모음'인 것이다.
이게 무슨 말인가?
#include <iostream>
using namespace std;
int main()
{
const char* test1 = "Hello, World";
char test2[] = "Hello, World";
return 0;
}
test1 이라는 바구니가 메모리에 할당 되지만, test2 라는 바구니는 없다. 그냥 바구니 모음의 시작 주소를 test2로 부르는 것이다.
또한 배열은 실제 그 값을 가지고 있다는 것이고 포인터는 그냥 data 영역에 저장된 Hello World 값을 가리키는 주소만 들고 있기 때문에 수정이 되지 않는다.
'C++ > 기초' 카테고리의 다른 글
[C++] 객체 지향 - 1 (3) | 2023.11.27 |
---|---|
[C++] 포인터 - 4 (다중 포인터, 다차원 배열) (0) | 2023.11.26 |
[C++] 포인터 - 2 (참조) (1) | 2023.11.25 |
[C++] 포인터 - 1 (0) | 2023.11.24 |
[C++] 함수 (1) | 2023.11.24 |