반응형
동적할당
코드를 작성하면서 최적화라던지 여러가지 이유로 런타임에 배열의 크기를 결정해야 할 때가 있습니다.
그럴 때 동적할당을 하게 되는데, C++에서 1차원배열인 경우와 2차원배열은 경우의 작성 코드에 차이가 있어서 한번 소개해 보려고 합니다.
예제
<1차원 배열>
우선 크기가 5인 일차원 배열을 선언하는 경우의 코드입니다.
int* arr = new int[5]; //크기가 5인 일차원 배열 동적할당일차원 배열의 경우에는 그냥 간단히 new 키워드를 이용해서 위와 같이 선언하면 됩니다.
2차원 배열의 경우에는 살짝 다릅니다.
<2차원 배열>
2차원 배열의 경우에는 2중 포인터를 사용합니다.
아래의 그림을 보면 좀 더 잘 이해할 수 있을 것입니다. 아래의 그림은 3X4 이차원 배열입니다.
arr의 각각의 인덱스들이 일차원 배열을 가르키고 있는 형태입니다.
아래와 같은 형태로 2차원 배열을 동적할당 할 수 있습니다.
int** arr = new int*[row]; //선언하고자 하는 이차원 배열의 행의 수 만큼 동적 할당 for(int i = 0; i < row; i++) //각각의 인덱스에 선언하고자 하는 배열의 크기만큼을 가르키게 함. arr[i] = new int[col];
위의 코드와 같은 형태로 3X4 배열을 동적할당하는 코드를 작성해보겠습니다.
실제 코드를 작성할 때는 런타임에 row와 col 변수에 변수를 입력 받아서, 대입하면 됩니다.
int** arr = new int*[3]; //행의 크기가 3인 이차원 배열 for(int i=0; i<3; i++) //각각의 행에 길이가 4인 배열을 할당 arr[i] = new int[4];
2차원 배열 할당 해제
그렇다면 할당한 2차원 배열을 할당 해제하는 방법을 알아보겠습니다.
일반적으로는 반복문을 사용해서 할당을 해제합니다. 3X4 배열을 할당하고, 할당을 해제하는 코드를 보여드리겠습니다. 아래 코드를 보면 쉽게 이해할 수 있을 것입니다.
가벼운 마음으로 C++에서 2차원 배열을 어떻게 동적할당을 하는지 알아봤습니다.
반응형
공유하기
게시글 관리
구독하기기록노트- 카카오스토리
- 트위터
- 페이스북
'컴퓨터 > C\C++' 카테고리의 다른 글
[C++ STL]pair 클래스 사용방법 (0)2021.06.05[c언어/c++] isdigit 함수(숫자를 판별하는 함수) (0)2021.05.15[C++]1-1.상속(Inheritance)[feat. 급여관리] (0)2021.05.07C/C++ : static 선언에 대하여 (0)2021.03.022차원 배열을 매개변수로 넘길 때
- 프로그래밍/C언어
- 2011. 3. 7. 23:37
2차원 배열을 매개변수로 넘길 때 #include <iostream> using std::cout;
using std::cin;
using std::endl;
int func(???) //2차원 배열을 어떤 형태로 받아야 할까?
{
for(int i=0; i<2; i++)
{
for(int j=0; j<3; j++)
{
cout<<arr[i][j];
}
cout<<endl;
}
return 0;
}
//메인함수
int main()
{
int arr[2][3]=
{
{1,2,3},
{4,5,6}
};
func(arr); //2차원배열의 주소를 매개변수로 보냄
return 0;
}
시도해볼 수 있는 예.
1. int** arr
->2차원 배열임을 생각할 때 2차원의 주소이니 더블포인터로 받아야겠다는 생각으로 가장 먼저 시도해볼 수 있는 방법.
그러나 arr[2][3]을 int **형으로 변환할 수 없다는 컴파일 오류
2. int *arr
->int** 실패 후 포인터의 차원이 다른가보다라는 생각으로 두번째로 시도해보는 방법
역시 arr[2][3]을 int *형으로 변환할 수 없다는 컴파일 오류
3. int* arr[3]
->포인터만으로 받는 방법이 모두 실패한 후 배열을 넣어서 시도
그러나 이것은 int*형 배열을 3개 잡는(포인터배열) 방식임으로 당연히 실패
4. int arr[][3] or int arr[2][3]
->위의 경우를 실패하고 단순하게 2차원 배열의 모습으로 전달.
당연이 성공하지만 포인터를 이용한 방식으로 생각해볼 필요가 있음
##int arr[][] of int arr[2][]으로 넘길 시 오류
->int max[60][100] 이라는 변수를
아규먼트로 int * max 형태로 받았을때,
max[30][50] 으로 접근하려고 한다면.....
30 * 100 + 50 으로 접근이 되어야한다.
하지만, function 은 100 이라는 값을 알지 못하기 때문에 이를 알려줄 필요있음.
위의 코드는 void function( int Max[][100] ); 혹은 void function(int Max[60][100]); 으로 선언되어야 함.
5. int (*arr)[3]
->성공. (*arr)[3] 뒤에 길이가 3인 2차원배열을 가르키는 포인터
6. int *(arr)[3]
->5번의 경우에서 괄호의 다르게 했을 경우
int [2][3]'에서 'int *[]'(으)로 변환할 수 없습니다.라는 컴파일 오류
=>
int [2][3] or int [][3] 방식이나 int (*arr)[3]의 모습으로 전달할 때 성공
즉, 결론은 함수가 넘겨받은 변수 자체로부터 배열 차원들을 알아낼 수 있는 방식으로 전달해주어야 한다.
출저://blog.naver.com/ace01kr?Redirect=Log&logNo=130087154648
[출처] [C]2차원 배열을 매개변수로 넘길 때|작성자 민비
공유하기
게시글 관리
구독하기자기계발을 멈추면 죽는다저작자표시
- 카카오스토리
- 트위터
- 페이스북
이 글을 공유하기
Google +
Kakao
Naver
'프로그래밍/C언어' 관련 글
void형 포인터
2011.03.09
함수포인터 정리
2011.03.09
배열 포인터 동적할당 (C언어 C++)
2011.03.04
enum 은 상수였다...
2011.03.04
'프로그래밍/C언어' 관련 글 더보기
댓글(6)
비밀 글
등록