2011-03-18 11 views
4

int f (int P[2][4])A[2][3]을 허용하지 않지만 B[3][4]이라는 책을 읽었습니다. 이것에 대한 이유는 무엇입니까? 특히 포인터를 사용하여 동적 할당을 만들 때 문제가되지 않습니다. 감사배열을 매개 변수로 전달

답변

4

이유는 함수 매개 변수가 실제로 배열 유형을 갖지 않기 때문입니다. 정말

int f(int (*P)[4]); 

Pint의 배열에 대한 포인터 말했다 것처럼 컴파일러는 선언을

int f(int P[2][4]); 

을 처리합니다. 유형 int [3][4]은 동일한 유형으로 감소합니다. 그러나 int [2][3] 유형은 호환되지 않는 int (*)[3] 유형으로 대신 붕괴됩니다.

동적 할당은 완전히 다른 문제이며 이 아니며은 사용자가 배열하는 방식과 관계없이 배열 배열 유형을 포함합니다. (포인터 배열, 가능성이 높습니다.)

+0

배열이 참조로 전달되지 않으면 ... –

+0

@Ben 그런 다음 매개 변수 유형이 array-of-array를 참조하십시오. 그것은 reference-to-class-type이 클래스 유형이 아닌 것과 같은 방식으로 배열 타입이 아닙니다. – aschepler

+0

나는 당신의 대답이 틀렸다는 것을 말하지 않고있다. 나는 IMO라고 언급 할만한 가치가있는 다른 사례를 언급하고있다. –

1

이 허용되지 왜 이유, f(int P[2][4]) 그래서 당신이 int (*B)[4]로 붕괴 할 수 int B[3][4]를 전달할 수 있습니다 f(int (*P)[4])되기 때문에,하지만이 int A[2][3] 붕괴 int (*A)[4]으로는 후자 있도록 f(int (*P)[4])에 의해 허용되지 않습니다 수 없습니다.

유형 int (*)[3]int (*)[4]과 호환되지 않습니다. 하나는 다른 사람으로 변환 할 수 없습니다!

그러나 해결 방법이 있습니다. 다음을 할 수 있습니다 :

template<size_t M, size_t N> 
int f(int (&P)[M][N]) 
{ 
     //Use M and N as dimensions of the 2D array! 
} 

//Usage 
int A[2][3]; 
f(A); //M becomes 2, N becomes 3 

int B[3][4]; 
f(B); //M becomes 3, N becomes 4 

모든 2 차원 배열을 허용합니다!

+2

질문은 "피할 수없는 이유는 무엇입니까?"가 아니라 "피하는 방법"이었습니까? –

+0

@ Null : 내 대답을 편집했습니다. 봐! – Nawaz

5

이유는 다음과 같습니다. int f (int P [2] [4]); 은 int f (int (* P) ​​[4])의 동의어입니다. 함수 선언의 첫 번째 차원은 주석입니다.

+0

+1. 그러나 variadic 함수에 대한 놀라운 예외가 있습니다. http://stackoverflow.com/questions/1353407/var-args-last-named-parameter-not-function-or-array을 참조하십시오. –

+0

당신은 iitb에서 왔습니까? –

+0

@Frustrated Coder : 그는 IITB 출신이 아닙니다. 그는'litb' (let-it-be)입니다. 제임스 카제 (James Kanze)는 다음과 같이 응답합니다. –

1

C 및 C++에서 함수가 2 차원 배열을 사용하도록 지정하면 명시적인 열 크기 (두 번째 [])를 가져야합니다. 행 크기 (첫 번째 [])는 선택 사항입니다.

0

두 번째 매개 변수는 모든 열에 포함될 요소의 수에 따라 2 차원 배열 유형을 정의합니다.

첫 번째 매개 변수는 배열의 크기만을 정의하며,이 함수에 더 긴 배열을 보낼 수 있기 때문에 다음과 같은 형식의 매개 변수를 전달하는 것과 같습니다. int * [3] 이는 크기가 10 인 1 차원 배열을 함수를 사용하면 더 짧은 크기의 배열을 얻을 수 있습니다.

1

메모리 레이아웃이있는 todo가 있습니다. 첫 번째 숫자는 기본적으로 행 수이고 두 번째 숫자는 각 행에 몇 개의 요소가 있는지입니다. 행은 서로 직접 배치됩니다. 따라서 오프셋은 행의 요소 수에 선행 행 수를 곱한 값에 의해 결정됩니다. 컴파일 된 함수는 4 개의 요소를 기반으로 행 오프셋을 계산합니다. 다른 행 길이의 배열을 전달할 때 이러한 계산이 잘못됩니다.

관련 문제