2012-10-17 3 views
3

가능한 중복 :
Confusion over C++ pointer and reference topic배열/포인터/참조 혼란

가정하자 내가 함수에 매개 변수로

int arr[10]; 

을 전달하고있다.

이 모든 유효한 함수 프로토 타입입니까? 그들은 논쟁의 측면에서 어떻게 다릅니 까?

은 지금까지 (정확한 경우 또는 확실하지) 알고있다

1. void foo(int &arr);  //a reference to an array, which preserve the size attribute? 
2. void foo(int &arr[]); //the same (is it)? 
3. void foo(int (&arr)[]); //I don't know 
4. void foo(int &arr[10]); //is it the same as 2? 
5. void foo(int (&arr)[10]);//no idea 

6. void foo(int *arr);  //a decayed pointer of the array, pointing to the first element of the array, losing the size attribute? 

7. void foo(int *arr[]); //the same (is it?) 
8. void foo(int (*arr)[]); //a pointer to an array, preserve the size 
9. void foo(int *arr[10]); //the same as 7 (is it?) 
10. void foo(int (*arr)[10]);//is the same as 8 (is it?) 

11. void foo(int arr[]); //is the same as 6 (is it?) 
12. void foo(int arr[10]); // is the same as 6 (is it?) 

(나는 ... 죄송합니다, 나는 완전히 혼란 스러워요,이 긴 설명이 필요 알고)

+0

왜 당신은 귀찮게합니까? 이 숙제가 있니? – fredoverflow

+1

코드에서 닫는 괄호를 확인하십시오 ...너는 그들 중 많은 것을 놓치고있다. –

+0

나는 단지 호기심이 아니다. 그리고 이것은 숙제가 아니다. – Chin

답변

8

첫 번째 중요한 정보는 형식이 T 인 (바운드 또는 무제한) 배열 인 매개 변수가 T에 대한 포인터로 변환된다는 것입니다. 나는. int arr[]int arr[10]은 모두 int * arr으로 변환됩니다. 변환은 최상위 배열에서만 수행됩니다. 즉, int (*arr)[10]에는 발생하지 않으며 int 배열에 대한 포인터입니다.

또한 식별자의 오른쪽에있는 것들은 왼쪽에있는 것보다 더 가깝게 바인딩됩니다. 즉 int *arr[10]은 배열이고 int (*arr)[10]은 포인터입니다.

마지막으로, 참조에 대한 포인터와 포인터에 대한 포인터는 포인터가 아니며 제한되지 않은 배열에 대한 참조와 마찬가지로 유효하지 않습니다. 유형 int *이 될 것 foo에 전달 된 값 - foo에 인수로 arr를 사용

1. void foo(int &arr);  // can't pass, reference to int 
2. void foo(int &arr[]);  // invalid, pointer to reference to int 
3. void foo(int (&arr)[]); // invalid, reference to unbounded array of int 
4. void foo(int &arr[10]); // invalid, pointer to reference to int 
5. void foo(int (&arr)[10]); // can pass, reference to an array of int 

6. void foo(int *arr);  // can pass, pointer to int 
7. void foo(int *arr[]);  // can't pass, pointer to pointer to int 
8. void foo(int (*arr)[]); // invalid, pointer to an unbounded array of int. 
9. void foo(int *arr[10]); // can't pass, pointer to pointer to int 
10. void foo(int (*arr)[10]); // can't pass, pointer to array of int 

11. void foo(int arr[]);  // can pass, pointer to int 
12. void foo(int arr[10]); // can pass, same as above 

는 그것의 첫 번째 요소에 대한 포인터를 부패하게됩니다. &arr을 숫자 10에 전달할 수 있습니다.이 경우 int (*)[10] 유형의 값이 전달되고 부식이 발생하지 않습니다.

+2

여기에는 많은 실수가 있습니다. 예를 들어 # 3과 # 8은 유효하지 않으며 # 10은 # 9와 동일하지 않습니다. 또한 실제 질문에 답을하지 않았습니다. 함수가 전달할 수있는 함수는 무엇입니까? – interjay

+1

* # 10 *은 int **의 정수가 아닌 10 개의 정수 배열에 대한 포인터입니다 – Praetorian

+0

whoops my bad ..., @MooingDuck, 편집 해 주셔서 감사합니다! – avakar

0

어려운 부분은 배열이 값으로 전달되지 않지만 포인터는 감소한다는 점입니다.

당신 선언의 일부는 구문 오류는 다른이 아니다 (하지만 아마 당신은 생각도하지 않습니다) 귀하의 경우에는

이 TEH, 만 하나의 의미가 그 있습니다 6, 11, 12

2, 3, 4 및 8에는 자체 설명 오류 메시지가 있습니다.

t1.cpp:2:19: error: declaration of 'arr' as array of references 
t1.cpp:3:22: error: parameter 'arr' includes reference to array of unknown bound 'int []' 
t1.cpp:4:21: error: declaration of 'arr' as array of references 
t1.cpp:8:22: error: parameter 'arr' includes pointer to array of unknown bound 'int []' 

는 다른 사람들이 참조 - 어레이 또는 -pointer-, 그들은 동일하게 동작합니다 (어떻게 든 중복 (당신이 잘못된 연산자 우선 순위 선언을 읽을 수 있기 때문에 당신이 그들을 이해하지 않으면 가능성이 높습니다) 함수 내에서) 또는 단순히 잘못된 것으로 선언하기 때문에 (7,9,10처럼 : 이중 간접 참조를 나타내는 반면, 일반 배열은 단일 배열을 가지며 1은 간접 참조를 나타내지 않습니다. 그것은 단지 하나의 int 별명을 가지고 있습니다)