[C++] 16. 2차원배열

2022. 5. 31. 00:08코딩 1막 <C++개념편>

728x90
#include <iostream>

using namespace std;

void main()
{
	
	int scoreA = 10;
	int scoreB = 20;
	int scoreC = 30;

	// 배열 : 메모리상에서 연속적으로 나열된 상태
	int scores[] = { 10, 20, 30 };

	cout << "[0]의 값 : " << scores[0] << endl;
	cout << "[1]의 값 : " << scores[1] << endl;
	cout << "[2]의 값 : " << scores[2] << endl;

	// 일반 변수들의 선언으로는 각 주소들이 규칙적이지 않다.
	// 배열은 주소가 연속적으로 이루어져있다.
	cout << "[0]의 주소 : " << &scores[0] << endl;
	cout << "[1]의 주소 : " << &scores[1] << endl;
	cout << "[2]의 주소 : " << &scores[2] << endl;

	cout << endl;
	
	int scores[] = { 10, 20, 30, 40, 50} ;

	cout << scores << endl;	// 첫번째 주소
	cout << &scores[0] << endl; // 위와 동일
	cout << scores + 1 << endl; // 두번째 주소
	cout << *(scores + 1) << endl; // 두번째 주소의 값

	// 캐싱 : 불필요한 연산을 줄일수 있다.
	int count = sizeof(scores) / sizeof(scores[0]); 
	for (int i = 0; i < count; i++)
	{
		cout << i << "번째의 주소 : " << &scores[i] << endl;
	}
	

	int scores[] = { 2, 4, 6, 8, 10, 12, 14 } ;

	int count = sizeof(scores) / sizeof(scores[0]);
	for (int i = 0; i < count; i++)
	{
		cout << i << "번째 요소의 주소 : " << scores + i << endl;
		cout << i << "번째 요소의 주소의 값 : " << * (scores + i) << endl;
		cout << endl;
	}

	// 다중배열
	// 1차원 배열
	int scores[6] = {10, 20, 30, 40, 50, 60} ;
	int count = sizeof(scores) / sizeof(scores[0]);
	for (int i = 0; i < count; i++)
	{
		cout << i << "번째 요소의 주소 : " << scores + i << endl;
		cout << i << "번째 요소의 주소의 값 : " << *(scores + i) << endl;
		
		cout << endl;
	}
	cout << scores << endl; // 첫번째 요소의 주소 
	cout << *scores << endl; // 첫번째 요소의 주소의 값 = 10
	cout << scores + 4 << endl; // 4번째 요소의 주소 
	cout << *(scores + 4) << endl; // 4번째 요소의 주소의 값 = 50

	cout << endl << endl;

	// 2차원 배열 : 1차원 배열에 축이 하나 더 늘어난 것
	int scoresArray[2][3] =
	{
		{10, 20, 30},
		{40, 50, 60}
	};
	
	cout << scoresArray << endl; // scoresArray[0][0] = 첫번째덩어리 주소 
	cout << *(scoresArray) << endl; // scoresArray[0][0] = 첫번째덩어리 주소..?? 
	cout << *(*(scoresArray)) << endl; // *scoresArray[0][0] = 첫번째덩어리 주소의 값 = 10
	cout << endl;

	cout << *(scoresArray) + 1 << endl; // scoresArray[0][1] = 첫번째덩어리 주소에 4byte만큼 더한 주소 = 첫번째덩어리에서 두번째요소의 주소 
	cout << *(*(scoresArray) + 1) << endl; // *scoresArray[0][1] =첫번째덩어리 주소에 4byte만큼 더한 주소의 값 = 20
	cout << endl;

	cout << *(scoresArray) + 2 << endl; // scoresArray[0][2] = 첫번째덩어리 주소에 8byte만큼 더한 주소 = 첫번째덩어리에서 세번째요소의 주소 
	cout << *(*(scoresArray) + 2) << endl; // scoresArray[0][2] = 첫번째덩어리 주소에 8byte만큼 더한 주소의 값 = 30
	cout << endl;

	cout << scoresArray + 1 << endl; // scoresArray[1][0] = 두번째덩어리 주소 = 첫번째덩어리 주소에 12byte만큼을 더한 주소 
	cout << *(scoresArray + 1) << endl; // scoresArray[1][0] = 두번째덩어리 주소 = 첫번째덩어리 주소에 12byte만큼을 더한 주소..??
	cout << *(scoresArray) + 3 << endl; // scoresArray[1][0] = 첫번째덩어리 주소에 12byte만큼 더한 주소 = 두번째덩어리에서 첫번째요소의 주소
	cout << *(*(scoresArray) + 3) << endl; // *scoresArray[1][0] = 첫번째덩어리 주소에 12byte만큼 더한 주소의 값 = 두번째덩어리에서 첫번째요소의 주소의 값 = 40
	cout << endl;

	cout << *(scoresArray + 1) + 1 << endl; // scoresArray[1][1] = 두번째덩어리 주소에 4byte만큼을 더한 주소 = 첫번째덩어리 주소에 12byte을 더한 주소에 4byte를 더한 주소
	cout << *(*(scoresArray + 1) + 1) << endl; // *scoresArray[1][1] = 두번째덩어리 주소에 4byte만큼을 더한 주소의 값 = 첫번째덩어리 주소에 12byte을 더한 주소에 4byte를 더한 주소의 값 = 50
	cout << *(scoresArray) + 4 << endl; // scoresArray[1][1] = 첫번째덩어리 주소에 16byte만큼 더한 주소 = 두번째덩어리에서 두번째요소의 주소 
	cout << *(*(scoresArray) + 4) << endl; // *scoresArray[1][1] = 첫번째덩어리 주소에 16byte만큼 더한 주소의 값 = 두번째덩어리에서 두번째요소의 주소의 값 = 50
	cout << endl;

	cout << *(scoresArray + 1) + 2 << endl; // scoresArray[1][2] = 두번째덩어리 주소에 8byte만큼을 더한 주소 = 첫번째덩어리 주소에 12byte을 더한 주소에 8byte를 더한 주소
	cout << *(*(scoresArray + 1) + 2) << endl; // *scoresArray[1][2] = 두번째덩어리 주소에 8byte만큼을 더한 주소의 값 = 첫번째덩어리 주소에 12byte을 더한 주소에 8byte를 더한 주소의 값 = 60
	cout << *(scoresArray) + 5 << endl; // scoresArray[1][2] = 첫번째덩어리 주소에 20byte만큼 더한 주소 = 두번째덩어리에서 세번째요소의 주소 
	cout << *(*(scoresArray) + 5) << endl; // *scoresArray[1][2] = 첫번째덩어리 주소에 20byte만큼 더한 주소의 값 = 60
	cout << endl;

	
	//질문사항1. 매번 출력할때마다 주소가 바뀌는데 왜 그런것인가요?
	//질문사항2. 몇차원배열까지 있는지 궁금하며, 2차원 이상에서 배열문을 작성하는게 보통 게임을 짤때 어떤식으로 응용이 될수있는지 궁금합니다.


	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			cout << *(scoresArray + i) + j << " ";
		}
		cout << endl;
	}

	int col = sizeof(scoresArray[0]) / sizeof(int);	// 2차원 배열의 가로 크기를 구할때 가로 한줄의 크기를 요소의 크기로 나눠줌
	int row = sizeof(scoresArray) / sizeof(scoresArray[0]);	// 2차원 배열의 세로 크기를 구할때 배열이 차지하는 전체 공간을 가로 한줄의 크기로 나눠줌
	for (int i = 0; i < row; i++)	// 2차원 배열의 세로 크기만큼 반복
	{
		for (int j = 0; j < col; j++)	// 2차원 배열의 가로 크기만큼 반복
		{
			cout << scoresArray[i][j] << " ";	// 2차원 배열의 인덱스에 변수 i, j를 지정
		}
		cout << endl;
	}
}

728x90

'코딩 1막 <C++개념편>' 카테고리의 다른 글

[C++] 18. 구조체변수의 포인터 vs 정수형변수의 포인터  (0) 2022.05.31
[C++] 17. 구조체  (0) 2022.05.31
[C++] 15. sizeof()  (0) 2022.05.31
[C++] 14. 배열  (0) 2022.05.30
[C++] 13. 포인터변수  (0) 2022.05.30