4-6. 배열

Crat3 ㅣ 2023. 5. 22. 18:01

1. 필요성

struct StatInfo
{
    int hp;
    int atk;
    int def;
};

위의 구조체를 이용하는 몬스터를 여러 마리 만든다고 할 때, 코드의 최적화를 위해 배열을 이용할 수 있다.

 

2. 문법

int main()
{
    StatInfo monsters[10];
    
    return 0;
}

스택 내부에 StatInfo 구조체를 10개씩 이어서 만들어 저장한다.

배열의 크기는 상수이어야 한다(VS 기준).

배열의 이름은 배열의 시작 위치를 가리키는 포인터( [타입]* 포인터 )

즉 위에서 monsters 는 시작 위치의 주소값을 가지는 포인터임.

 

3. 응용

각 배열의 요소에 접근하는 방법은 포인터의 연산을 사용한다.

int main()
{
    StatInfo monsters[10];

    StatInfo* monster_0 = monsters;
    monster_0->hp = 100;
    monster_0->atk = 8;
    monster_0->def = 5;

    StatInfo* monster_1 = monsters + 1;
    monster_1->hp = 200;
    monster_1->atk = 20;
    monster_1->def = 2;

    return 0;
}

포인터가 아닌 참조 문법을 사용하면 다음과 같이 나타낼 수 있다.

    StatInfo& monster_2 = *(monsters + 2);
    monster_2.hp = 300;
    monster_2.atk = 30;
    monster_2.def = 3;

한편, 반복문을 사용하여 더 간단히 만들 수 있다.

    for (int i = 0; i < 10; i++)
    {
        StatInfo& monster = *(monsters + i);
        monster.hp = 100 * (i + 1);
        monster.atk = 10 * (i + 1);
        monster.def = (i + 1);
    }

*(monsters + i) 와 같은 용법은 가독성이 떨어진다. 이를 해결하기 위해 인덱스를 사용할 수 있다.

    for (int i = 0; i<10; i++)
    {
    	// 단, i는 0번째 부터 9번째 까지
        monster[i].hp = 100 * (i + 1);
        monster[i].atk = 10 * (i + 1);
        monster[i].def = (i + 1);
    }

 

4. 배열 초기화 문법

(1) 배열의 모든 요소를 0으로 만든다.

    int numbers[5] = {};

 

(2) 일부 배열만 값을 지정하는 것도 가능하다.

    int numbers1[10] = {1, 2, 3, 4, 5};

설정하지 않은 나머지 값은 0으로 저장된다.

 

 

(3) 오른쪽의 값의 개수만큼의 배열을 만들고 싶다면 아래와 같이 사용한다.

    int numbers2[] = {1, 2, 3, 4, 5, 6, 7};

 

'기초 C++ 스터디' 카테고리의 다른 글

4-9. 멀티 포인터  (0) 2023.05.23
4-7. 포인터 vs 배열  (0) 2023.05.22
4-5. 포인터 vs 참조  (0) 2023.05.11
4-4. 참조  (0) 2023.05.11
4-2. 포인터 연산  (0) 2023.05.11