2차원 배열
-> 배열의 원소로 배열을 가지는 것.
-> 2차원 배열은 뒤에서부터 읽으면 편하게 읽을 수 있다.
2차원 배열의 형태
자료형 변수명[행][열]
int iArr[2][3];
2차원 배열의 초기화
1차원 배열의 초기화와 같다.
int iArr[2][3] =
{
{ 1, 2, 3 },
{ 4, 5, 6 }
};
2차원 배열의 모든 원소 접근
for (int i = 0; i < 2; ++i)
{
for (int j = 0; j < 3; ++j)
cout << iArr[i][j] << '\t';
cout << endl;
}
2차원 배열의 시작 주소
int iArr[2][3] = { 1, 2, 3, 4, 5, 6 };
cout << iArr << endl;
2차원 배열의 첫 번째 원소(배열)의 값
-> 배열의 값은 == 배열의 시작 주소
-> 첫 번째 배열의 시작 주소
cout << iArr[0] << endl;
2차원 배열의 두 번째 원소의 값
-> 두 번째 배열의 시작 주소
cout << iArr[1] << endl;
매개 변수의 int* _iArr 와 int _iArr[]는 같은 의미이다.
void Func(int _iArr[]) == void Func(int* _iArr)
같은 의미를 갖는 이유는 해당 매개 변수가 포인터인지 배열인지 구분을 하기 위해서이다.
배열을 함수 인자로 전달하는 방법
int iArr1[5] = { 1, 2, 3, 4, 5 };
int iArr2[10] = { 1, 2, 3, 4, 5 };
Func(iArr1, 5);
Func(iArr2, 10);
1차원 배열을 2차원 배열처럼 출력하기
int iArr[25] = {};
for (int i = 0; i < 25; ++i)
{
iArr[i] = i + 1;
}
for (int i = 0; i < 5 ; ++i)
{
for (int j = 0; j < 5 ; ++j)
cout << iArr[j + (i * 5)] << '\t';
cout << endl;
}
2차원 배열 포인터 형
int iArr[2][3] = { 1, 2, 3, 4, 5, 6 };
cout << iArr << endl; // 2차원 배열의 시작 주소
cout << iArr[0] << endl; // 2차원 배열의 첫 번째 원소 -> 1차원 배열 -> 주소
cout << *iArr << endl;
cout << **iArr << endl;
역참조 연산자를 2번 사용하니, 포인터 변수에 에스크리터 2개를 추가하여 대입이 가능한가?
2차원 배열은 2중 포인터가 아니기때문에 불가능하다.
2중 포인터가 아닌 이유는 포인터 연산 증가 값의 차이점을 통해 알아보자.
ptr이 100번지라고 가정할 경우
ptr + 1은 몇 번지를 가리킬까?
ptr은 주소를 저장한다.
double*의 주소를 저장한다.
double*는 4byte의 크기를 가진다.
(증가는 4byte 만큼만 증가 한다.)
double** ptr = nullptr;
ptr + 1
2차원 배열의 증가 값은
-> 자료형 * 열의 개수 만큼 증가한다.
int iArr[2][3] = { 1, 2, 3, 4, 5, 6 };
cout << iArr << endl;
cout << iArr + 1 << endl;
이중 포인터와 2차원 배열은 증가 값이 다르다
-> 이중 포인터에 2차원 배열의 주소를 저장 할 수 없다.
2차원 배열의 포인터형
-> int형 주소를 저장할 공간 3개를 만들고, 포인터 변수에 해당 공간을 대입해보자.
빨간줄이 뜬 이유?
-> 2차원 배열의 포인터 형은 기존의 배열이랑 똑같이 선언을 하게되면 오류가 발생한다.
2차원 배열의 포인터 형은 다음과 같다.
기존 방식에서 *ptr 부분을 가로로 감싸주면 끝이다.
3차원 배열
-> 3차원 배열은 대부분 사용을 하지 않는다고 한다.
-> 그러므로 사용 방법만 간단하게 적어보자.
int iArr[2][3][4] =
{
{
{ 11, 12, 13, 14 },
{ 15, 16, 17, 18 },
{ 19, 20, 21, 22 }
},
{
{ 23, 24, 25, 26 },
{ 27, 28, 29, 30 },
{ 31, 32, 33, 34 }
}
};
'Programming > C++ Basic' 카테고리의 다른 글
C++ 문자열 함수 (0) | 2020.08.31 |
---|---|
C++ 문자 배열과 문자열 상수 (0) | 2020.08.28 |
C++ 배열과 포인터 (0) | 2020.08.28 |
C++ const와 포인터 (0) | 2020.08.28 |
C++ 포인터 (0) | 2020.08.26 |