[C++] 2차원 배열 복습

leeeha·2021년 9월 22일
0

C++

목록 보기
6/7

2차원 배열 선언 및 초기화

참고자료
https://jhnyang.tistory.com/338
https://dojang.io/mod/page/view.php?id=563

#include <iostream>
using namespace std;

// 2차원 배열을 함수 매개변수로 전달 받을 때는 
// 칼럼 크기를 지정해줘야 한다. 
//void print2DArray(int arr[][5], int row, int col)
void print2DArray(int (*arr)[5], int row, int col)
{
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < col; j++)
			cout << arr[i][j] << " ";
		cout << endl;
	}
}

int main()
{
	//int arr[2][5]{}; // 0으로 초기화

	int arr[2][5] {
		{1, 2, 3, 4, 5},
		{6, 7, 8, 9, 10}
	};

	// 배열 전체 크기를 한 행의 크기로 나눠서 row 구하기
	int row = sizeof(arr) / sizeof(arr[0]);

	// 한 행의 크기를 자료형 크기로 나눠서 col 구하기
	int col = sizeof(arr[0]) / sizeof(int); 

	print2DArray(arr, row, col);

	return 0;
}

column 크기 지정은 필수!

2차원 배열을 선언할 때, 적어도 열의 크기는 반드시 지정해줘야 한다. 행의 크기만 지정하면 각 행이 몇 개의 원소를 갖는지 알 수 없는데, 열의 크기를 지정하면 행의 크기는 컴파일러가 알아서 유추할 수 있기 때문이다.

#include <iostream>
using namespace std;

void print2DArray(int arr[][4], int row, int col)
{
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < col; j++)
			cout << arr[i][j] << " ";
		cout << endl;
	}
}

int main()
{
	// 에러가 발생하는 경우
	//int arr[][] = { 1, 2, 3, 4 };
	//int arr[][] = { {1, 2}, {3, 4} };
	//int arr[2][] = { 1, 2, 3, 4 };
	//int arr[][3];

	// 에러 없음
	int arr[][4] = { 1, 2, 3, 4 }; 
	int arr1[][4] = { 1, 2, 3, 4, 10, 20, 30, 40 }; 
	int arr2[][4] = { 1, 2, 3, 4, 10, 20 };
	int arr3[][4] = {
		{1}, // 1 0 0 0
		{2, 3} // 2 3 0 0 
	};
    // 초기화 하지 않은 원소들은 0으로 초기화 됨.

	print2DArray(arr, 1, 4);
	print2DArray(arr1, 2, 4);
	print2DArray(arr2, 2, 4);
	print2DArray(arr3, 2, 4);

	return 0;
}

1 2 3 4

1 2 3 4
10 20 30 40

1 2 3 4
10 20 0 0

1 0 0 0
2 3 0 0

메모리 주소 확인

#include <iostream>
using namespace std;

int main()
{
	int arr[2][4]{};

	int row = sizeof(arr) / sizeof(arr[0]);
	int col = sizeof(arr[0]) / sizeof(int);

	for (int r = 0; r < row; r++) {
		for (int c = 0; c < col; c++) {
			// 배열의 각 원소에 할당된 메모리 주소 출력하기 
			printf("&arr[%d][%d] => %d\n", r, c, &arr[r][c]);
		}
		printf("\n");
	}


	return 0;
}

int형이므로 주소 값이 4바이트씩 차이가 난다는 것을 확인할 수 있다.


2차원 배열 동적할당

참고자료
https://jhnyang.tistory.com/334
https://dojang.io/mod/page/view.php?id=319

  • 배열을 힙 영역에 동적 할당하면, 런타임 시 배열 크기를 지정할 수 있다는 장점이 있다.
  • 동적 할당은 배열 길이가 동적으로 늘었다 줄었다 하는 게 아니라, 런타임에 배열 크기를 동적으로 지정하여 힙 영역에 메모리 공간을 할당한다는 뜻이다.

이중 포인터를 사용하여 2차원 배열을 동적 할당하는 방법을 알아보자!

#include<iostream>
using namespace std;

int main(){
	int n, m;
	cin >> n >> m;

	// 2차원 배열 선언
	int** p = new int* [n]; // n개의 행
	for (int i = 0; i < n; i++) {
		p[i] = new int[m]; // m개의 열
	}

	// 2차원 배열 초기화
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			int x;
			cin >> x;
			p[i][j] = x;
		}
	}

	// 출력
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cout << p[i][j] << " ";
		}
		cout << "\n";
	}

	// 동적 할당 해제
	for (int i = 0; i < n; i++) // n개의 행
		delete[] p[i]; // 한 행을 가리키는 포인터
	delete[] p; // 배열 전체를 가리키는 포인터

	return 0;
}

vector로 2차원 배열 선언 및 초기화

vector는 번거로운 new, delete 연산을 알아서 처리하여, 배열의 동적 할당을 보다 편리하게 사용할 수 있게 해주는 C++ STL 컨테이너이다. 이번에는 vector로 2차원 배열을 선언하고 초기화해보자!

vector<int> v(10,0); // 10개의 원소를 0으로 초기화
vector<vector<int>> v(10, vector<int>(10,0)); // 10개의 원소를, 또 다시 벡터로 초기화
#include<iostream>
#include<vector>
using namespace std;

int main() {
	int n, m;
	cin >> n >> m;
	vector<vector<int>> vv(n, vector<int>(m,0)); // 0으로 초기화된 n행 m열

    // 2차원 배열 원소 입력 받기
	for(int i = 0; i < n; i++){
		for(int j = 0; j < m; j++){
			int num;
			cin >> num;
			vv[i][j] = num;
		}
	}
	
	// 2차원 배열 원소 출력하기
	for (vector<int> v : vv) {
		 for (int element : v)
			 cout << element << " ";
      cout << endl;
	}
	
	// 타입 추론
	// for(auto v : vv) { 
	// 	for(auto element : v)
	// 		cout << element << " ";
    //  cout << endl;
	// }

	return 0;
}
#include<iostream>
#include<vector>
using namespace std;

int main() {
	vector<vector<int>> vv; 
	vector<int> v;
	vv.push_back(v); // 벡터의 원소가 다시 벡터여서 2차원 배열

	// 첫번째 벡터에 원소 삽입
	vv[0].push_back(7);
	cout << vv[0][0] << '\n'; // 7
    
	return 0;
}
profile
습관이 될 때까지 📝

0개의 댓글