🙇‍♀️배열 기초 복습

struct StatInfo // 연습용 구조체
{
	int hp = 0xAAAAAAAA;
	int attack = 0xBBBBBBBB;
	int defence = 0xDDDDDDDD;
};


🪐배열

선언 방식 : TYPE 이름[개수];


배열의 크기는 상수여야 함 (VC 컴파일러 기준)

const int monsterCount = 10;
StatInfo monsters[monsterCount];


그런데 배열은 [이름] 조금 다르게 동작한다

배열의 이름은 곧 배열의 시작 주소

정확히는 시작 위치를 가리키는 TYPE* 포인터

StatInfo players[10];
*(players + 1) = *monsters;

참고) auto WhoAmI = monsters; auto는 CS에서의 var와 비슷한 것으로 monsters의 타입을 몰라도 사용가능함.


StatInfo* monster_0 = monsters;
monster_0->hp = 100;
monster_0->attack = 10;
monster_0->defence = 1;

// 포인터의 덧셈은 타입의 크기만큼 이동
StatInfo* monster_1 = monsters + 1;
monster_1->hp = 200;
monster_1->attack = 20;
monster_1->defence = 2;

// 포인터와 참조의 변환
StatInfo& monster_2 = *(monsters + 2);
monster_2.hp = 300;
monster_2.attack = 30;
monster_2.defence = 3;

// 위와 완전히 다른 의미
// temp라는 구조체를 만든 것이지 배열과는 무관함
StatInfo temp = *(monsters + 2);
temp.hp = 400;
temp.attack = 40;
temp.defence = 4;

// 자동화
for (int i = 0; i < 10; i++)
{
	StatInfo& monster = *(monsters + i);
	monster.hp = 100 * (i + i);
	monster.attack = 10 * (i + i);
	monster.defence = (i + i);
}

// *(monsters + i) 는 너무 불편하기에 더 편한 인덱스를 사용
// *(monsters + i) = monsters[i]
for (int i = 0; i < 10; i++)
{
	monsters[i].hp = 100 * (i + i);
	monsters[i].attack = 10 * (i + i);
	monsters[i].defence = (i + i);
}
  • 배열 초기화 문법 몇가지
int numbers[5] = {  }; // 다 0으로 초기화
int numbers1[10] = { 1,2,3,4,5 }; // 설정한 애들은 설정한 값으로, 나머지는 0
int number[] = { 1,2,3,4,5,5,6,7,2,8,9,9 }; // 데이터 개수만큼의 크기에 해당하는 배열로 만들어준다


🪐포인터 vs 배열

const char* test1 = "Hello World";char test2[] = "Hello World"; 둘다 에러 없이 만들어진다.

문자열은 기본적으로 const char[]의 타입형을 가지고있다.

에러가 없기에 포인터와 배열을 동일하게 생각할 수 있지만 엄연히 다르다!

포인터는 주소값만 전달하고 배열은 새로운 통이 생기는 것과 같다.

위의 예시를 보자면 "Hello World"라는 문자열은 .rdata영역에 생성되어 있고 포인터는 이때의 첫주소를 가리킨다.

배열은 어셈블리로 까보면 "Hello World"에서 4바이트씩 꺼내어서 배열의 공간에 넣어서 총12바이트가 된다 (문자열이르모 마지막에 '\0')

  • 배열을 함수 인자로 넘기면?
    • 컴파일러가 알아서 포인터로 치환한다 (char[] -> char*)
    • 즉 배열의 내용 전체를 넘긴게 아니라, 시작 주소(포인터)만 넘긴 것

태그:

카테고리:

업데이트: