로또 번호 생성기

// Lotto.cpp

#include <iostream>
using namespace std;

void Swap(int& a, int& b);
void Sort(int* arr, int len);
void ChooseLotto(int* arr);

int main()
{
	srand(time(0));
	int numbers[6];

	ChooseLotto(numbers);
	return 0;
}

void Swap(int& a, int& b)
{
	int temp = a;
	a = b;
	b = temp;
}

void Sort(int* arr, int len)
{
	for (int i = 0; i < len; i++)
	{
		for (int j = i + 1; j < len; j++)
		{
			if (arr[i] > arr[j])
				Swap(arr[i], arr[j]);
		}
	}
}

void ChooseLotto(int* arr)
{
	int temp;

	for (int i = 0; i < 6; i++)
	{
		temp = rand() % 45 + 1;
		for (int j = 0; j < i; j++)
		{
			if (temp == arr[j])
			{
				j = -1;
				temp = rand() % 45 + 1;
			}
		}
		arr[i] = temp;
	}
	Sort(arr, 6);
	
	cout << "로또 번호 생성 완료\n";
	for (int i = 0; i < 6; i++)
		cout << arr[i] << " ";
	cout << endl;
}

다중 포인터

void SetMessage(const char** a)
{
	*a = "Bye";
}

int main()
{
	const char* msg = "Hello";
	SetMessage(&msg);
	std::cout << msg << endl;
	return 0; 
}

* 연산자를 하나씩 제거하면서 타고 간다고 생각
void SetMessage(const char*& a)와 같이 포인터와 참조를 섞어쓰는 것도 가능함


다차원 배열

int main()
{
	int arr2d[2][5] = { {1, 2, 3, 4, 5}, { 11, 12, 13, 14, 15} };

	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < 5; j++)
			cout << arr2d[i][j] << " ";
		cout << endl;
	}
}

int arr[2][5]int arr[10]은 메모리상으로는 차이가 없음
배열 자료형의 크기만큼 메모리 주소를 이동해가면서 배열의 각 원소에 접근
2D배열은 대표적으로 2D 로그라이크 맵에 사용됨


포인터 마무리

포인터는 데이터의 메모리 주소를 담고있는 통로 역할로 크기가 작음
반면 배열은 실제로 데이터들의 집합이기 때문에 크기가 비대해질 수 있음
TYPE형 1차원 배열TYPE*형 포인터는 완전히 호환 가능함

int main()
{
	int arr2[2][2] = { {1, 2}, {3, 4} };
	int** pp = (int**)arr2 // 불가능
	int(*p2)[2] = arr2; // 가능
}

다차원 배열과 다차원 포인터는 아예 별개의 문법으로 사용되며, 서로 호환되지 않음
int(*)[2]의 경우 2개의 원소를 가지는 int형 배열의 포인터라는 의미로 사용됨

C++의 특성상 메모리를 다루는 작업에 주의해야함