참고자료
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;
}
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바이트씩 차이가 난다는 것을 확인할 수 있다.
참고자료
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는 번거로운 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;
}