int f (int P[2][4])
은 A[2][3]
을 허용하지 않지만 B[3][4]
이라는 책을 읽었습니다. 이것에 대한 이유는 무엇입니까? 특히 포인터를 사용하여 동적 할당을 만들 때 문제가되지 않습니다. 감사배열을 매개 변수로 전달
답변
이유는 함수 매개 변수가 실제로 배열 유형을 갖지 않기 때문입니다. 정말
int f(int (*P)[4]);
P
네 int
의 배열에 대한 포인터 말했다 것처럼 컴파일러는 선언을
int f(int P[2][4]);
을 처리합니다. 유형 int [3][4]
은 동일한 유형으로 감소합니다. 그러나 int [2][3]
유형은 호환되지 않는 int (*)[3]
유형으로 대신 붕괴됩니다.
동적 할당은 완전히 다른 문제이며 이 아니며은 사용자가 배열하는 방식과 관계없이 배열 배열 유형을 포함합니다. (포인터 배열, 가능성이 높습니다.)
이 허용되지 왜 이유, 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 차원 배열을 허용합니다!
질문은 "피할 수없는 이유는 무엇입니까?"가 아니라 "피하는 방법"이었습니까? –
@ Null : 내 대답을 편집했습니다. 봐! – Nawaz
이유는 다음과 같습니다. int f (int P [2] [4]); 은 int f (int (* P) [4])의 동의어입니다. 함수 선언의 첫 번째 차원은 주석입니다.
+1. 그러나 variadic 함수에 대한 놀라운 예외가 있습니다. http://stackoverflow.com/questions/1353407/var-args-last-named-parameter-not-function-or-array을 참조하십시오. –
당신은 iitb에서 왔습니까? –
@Frustrated Coder : 그는 IITB 출신이 아닙니다. 그는'litb' (let-it-be)입니다. 제임스 카제 (James Kanze)는 다음과 같이 응답합니다. –
C 및 C++에서 함수가 2 차원 배열을 사용하도록 지정하면 명시적인 열 크기 (두 번째 []
)를 가져야합니다. 행 크기 (첫 번째 []
)는 선택 사항입니다.
두 번째 매개 변수는 모든 열에 포함될 요소의 수에 따라 2 차원 배열 유형을 정의합니다.
첫 번째 매개 변수는 배열의 크기만을 정의하며,이 함수에 더 긴 배열을 보낼 수 있기 때문에 다음과 같은 형식의 매개 변수를 전달하는 것과 같습니다. int * [3] 이는 크기가 10 인 1 차원 배열을 함수를 사용하면 더 짧은 크기의 배열을 얻을 수 있습니다.
메모리 레이아웃이있는 todo가 있습니다. 첫 번째 숫자는 기본적으로 행 수이고 두 번째 숫자는 각 행에 몇 개의 요소가 있는지입니다. 행은 서로 직접 배치됩니다. 따라서 오프셋은 행의 요소 수에 선행 행 수를 곱한 값에 의해 결정됩니다. 컴파일 된 함수는 4 개의 요소를 기반으로 행 오프셋을 계산합니다. 다른 행 길이의 배열을 전달할 때 이러한 계산이 잘못됩니다.
- 1. jTemplates에 연관 배열을 매개 변수로 전달
- 2. 연관 배열을 패키지간에 매개 변수로 전달
- 3. db_query를 매개 변수로 전달
- 4. 매개 변수로 파일 전달
- 5. BeginInvoke를 매개 변수로 전달
- 6. URL을 매개 변수로 전달
- 7. CakePHP를 사용하여 검색 필터에 배열을 매개 변수로 전달 하시겠습니까?
- 8. 배열을 함수 매개 변수로 사용
- 9. C++ 매개 변수로 클래스 전달
- 10. 메서드에서 매개 변수로 개체 전달
- 11. 클래스를 매개 변수로 전달 하시겠습니까?
- 12. XMLDocument를 XSLT에 매개 변수로 전달
- 13. URL을 URL 매개 변수로 전달
- 14. ZK : 매개 변수로 작업 전달
- 15. 스크립트 변수를 매개 변수로 전달
- 16. Grails - 매개 변수로 링크 전달
- 17. RGui에 매개 변수로 스크립트 전달
- 18. 반환 형식을 java의 매개 변수로 전달 하시겠습니까?
- 19. 배열을 매개 변수로 사용하여 기본값으로 int main()
- 20. Java에서 매개 변수로 객체 배열을 전달하는 방법
- 21. 배열을 매개 변수로 전달하는 방법은 무엇입니까?
- 22. 동적 SQL (매개 변수로 테이블 이름 전달)
- 23. 한 va_list를 다른 매개 변수로 전달
- 24. DateTime 값을 OleDbCommand에 매개 변수로 전달
- 25. 익명 함수를 나중에 사용할 매개 변수로 전달
- 26. 클래스에 매개 변수로 창 이름 전달
- 27. C++ : 함수를 다른 함수의 매개 변수로 전달
- 28. URL을 매개 변수로 컨트롤러 작업에 전달
- 29. uiimageview를 NStimer 선택기의 매개 변수로 전달 하시겠습니까?
- 30. jQuery, 선택기를 옵션 매개 변수로 전달
배열이 참조로 전달되지 않으면 ... –
@Ben 그런 다음 매개 변수 유형이 array-of-array를 참조하십시오. 그것은 reference-to-class-type이 클래스 유형이 아닌 것과 같은 방식으로 배열 타입이 아닙니다. – aschepler
나는 당신의 대답이 틀렸다는 것을 말하지 않고있다. 나는 IMO라고 언급 할만한 가치가있는 다른 사례를 언급하고있다. –