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

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

이 글을 공유하기

댓글

Designed by JB FACTORY