2012-10-17 118 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]是一個指針。

最後,引用的數組和指針都是無效的,就像指針和對無界數組的引用一樣。

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作爲參數傳遞給foo將導致它衰減到一個指向它的第一個元素 - 傳遞給fooint *類型的值。請注意,您可以將&arr傳遞到數字10,在這種情況下,將傳遞int (*)[10]類型的值並且不會發生衰減。

+2

這裏有很多錯誤。例如,#3和#8無效,#10與#9不一樣。另外,你沒有回答實際的問題 - 函數可以通過'int arr [10]'。 – interjay

+1

*#10 *是一個指向10個整數數組的指針,而不僅僅是一個'int **' – Praetorian

+0

哎喲我的不好...,@MooingDuck,感謝編輯! – avakar

0

困難的部分是考慮數組不會傳遞值,但衰變成指針。

你的一些聲明的語法錯誤,一些其他的都沒有(但也不是什麼你可能認爲)

在你的情況,德只有一個意義是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:它們表示一個「雙向間接」,而一個普通數組有單一的,而且不代表任何間接:它只是一個int的別名)