#include <iostream>
using namespace std;
struct StatInfo
{
int hp = 0xAAAAAAAA;
int attack = 0xBBBBBBBB;
int defence = 0xDDDDDDDD;
};
int main()
{
// TYPE 이름[개수];
// 배열의 크기는 상수여야 함 (VC 컴파일러 기준, gcc는 통과함)
const int MONSTER_COUNT = 10;
StatInfo monsters[MONSTER_COUNT];
// 여태껏 변수들의 [이름]은 바구니의 이름이었음
// 배열은 [이름] 조금 다르게 동작한다.
StatInfo players[10];
// players = monsters; // error
// 그럼 배열의 이름은 뭐지?
// 포인터다. 즉, 배열의 이름은 곧 배열의 시작 주소
// 정확히는 시작 위치를 가리키는 TYPE* 포인터
auto WhoAmI = players;
StatInfo* monster_0 = monsters;
monster_0->hp = 100;
monster_0->attack = 10;
monster_0->defence = 5;
// 포인터의 덧셈
StatInfo* monster_1 = monster_0 + 1;
monster_1->hp = 200;
monster_1->attack = 20;
monster_1->defence = 10;
// 포인터와 참조는 자유자재로 변환 가능하다
StatInfo& monster_2 = *(monsters + 2);
monster_2.hp = 300;
monster_2.attack = 30;
monster_2.defence = 15;
// [주의] 이거는 완전 다른 의미다
// 값이 복사되는 것이다
StatInfo temp;
temp = *(monsters + 3);
temp.hp = 400;
temp.attack = 40;
temp.defence = 20;
// 반복문으로 배열을 순회하면서 값을 채워보자
for (int i = 0; i < MONSTER_COUNT; i++)
{
StatInfo& monster = *(monsters + i);
monster.hp = 100 * (i + 1);
monster.attack = 10 * (i + 1);
monster.defence = 5 * (i + 1);
}
// 근데 *(monsters + i) 이거 너무 길다, 가독성이 떨어진다
// 인덱스 사용!
// 배열은 0번부터 시작 [i]는 i번째 원소를 가리킨다
monsters[0].hp = 100;
monsters[0].attack = 10;
monsters[0].defence = 5;
for (int i = 0; i < MONSTER_COUNT; i++)
{
monsters[i].hp = 100 * (i + 1);
monsters[i].attack = 10 * (i + 1);
monsters[i].defence = 5 * (i + 1);
}
// 배열 초기화 문법 몇가지
int numbers[5] = { }; // 모든 원소를 0으로 초기화
int numbers_2[5] = { 1, 2, 3 }; // 1, 2, 3, 0, 0
int numbers_3[5] = { 1, 2, 3, 4, 5 }; // 1, 2, 3, 4, 5
int numbers_4[] = { 1, 2, 3, 4, 5 }; // 1, 2, 3, 4, 5 데이터 개수만큼 자동으로 배열 크기 결정
char helloStr[] = { 'H', 'e', 'l', 'l', 'o', '\0' }; // 문자열은 반드시 마지막에 널문자를 넣어야 한다
char helloStr_2[] = "Hello"; // 위와 동일한 표현
return 0;
}