C++ 2차원 배열 동적할당 매개변수 - c++ 2chawon baeyeol dongjeoghaldang maegaebyeonsu

반응형

동적할당

 

코드를 작성하면서 최적화라던지 여러가지 이유로 런타임에 배열의 크기를 결정해야 할 때가 있습니다.
그럴 때 동적할당을 하게 되는데, C++에서 1차원배열인 경우와 2차원배열은 경우의 작성 코드에 차이가 있어서 한번 소개해 보려고 합니다.

 

예제

<1차원 배열>

우선 크기가 5인 일차원 배열을 선언하는 경우의 코드입니다.

int* arr = new int[5]; //크기가 5인 일차원 배열 동적할당

일차원 배열의 경우에는 그냥 간단히 new 키워드를 이용해서 위와 같이 선언하면 됩니다.

2차원 배열의 경우에는 살짝 다릅니다.

 

<2차원 배열>

2차원 배열의 경우에는 2중 포인터를 사용합니다.
아래의 그림을 보면 좀 더 잘 이해할 수 있을 것입니다. 아래의 그림은 3X4 이차원 배열입니다.

arr의 각각의 인덱스들이 일차원 배열을 가르키고 있는 형태입니다.

C++ 2차원 배열 동적할당 매개변수 - c++ 2chawon baeyeol dongjeoghaldang maegaebyeonsu

 

아래와 같은 형태로 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 배열을 할당하고, 할당을 해제하는 코드를 보여드리겠습니다. 아래 코드를 보면 쉽게 이해할 수 있을 것입니다.

/******3x4 이차원 배열 할당******/
int** arr = new int*[3];

for(int i=0; i<3; i++)
	arr[i] = new int[4];
/*****************************/


/**********할당 해제***********/
for(int i=0; i<3; i++)
	delete[] arr[i];

delete[] arr;
/*****************************/

 

가벼운 마음으로 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.02

2차원 배열을 매개변수로 넘길 때

  • 프로그래밍/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]의 모습으로 전달할 때 성공

 

즉, 결론은 함수가 넘겨받은 변수 자체로부터 배열 차원들을 알아낼 수 있는 방식으로 전달해주어야 한다.


출저:http://blog.naver.com/ace01kr?Redirect=Log&logNo=130087154648

[출처] [C]2차원 배열을 매개변수로 넘길 때|작성자 민비

공유하기

게시글 관리

구독하기자기계발을 멈추면 죽는다

저작자표시

  • 카카오스토리
  • 트위터
  • 페이스북

이 글을 공유하기

C++ 2차원 배열 동적할당 매개변수 - c++ 2chawon baeyeol dongjeoghaldang maegaebyeonsu

Facebook

C++ 2차원 배열 동적할당 매개변수 - c++ 2chawon baeyeol dongjeoghaldang maegaebyeonsu

Twitter

C++ 2차원 배열 동적할당 매개변수 - c++ 2chawon baeyeol dongjeoghaldang maegaebyeonsu

Google +

C++ 2차원 배열 동적할당 매개변수 - c++ 2chawon baeyeol dongjeoghaldang maegaebyeonsu

Kakao

C++ 2차원 배열 동적할당 매개변수 - c++ 2chawon baeyeol dongjeoghaldang maegaebyeonsu

Naver

'프로그래밍/C언어' 관련 글

void형 포인터

2011.03.09

함수포인터 정리

2011.03.09

배열 포인터 동적할당 (C언어 C++)

2011.03.04

enum 은 상수였다...

2011.03.04

'프로그래밍/C언어' 관련 글 더보기

댓글(6)

    비밀 글

    등록