2009-11-12 163 views
3

我對C/C++中的數組和指針有一個基本的問題。指針數組作爲函數參數

說我有:

Foo* fooPtrArray[4]; 

如何將fooPtrArray傳遞到函數? 我曾嘗試過:

int getResult(Foo** fooPtrArray){} // failed 
int getResult(Foo* fooPtrArray[]){} // failed 

我該如何處理指針數組?

編輯:我曾經以爲的錯誤味精是從傳遞錯誤的指針數組,但是從所有的答覆,我意識到這是別的東西......(指針賦值)

Error msg: 
Description Resource Path Location Type incompatible types in assignment of 
`Foo**' to `Foo*[4]' tryPointers.cpp tryPointers line 21 C/C++ Problem 

我不不太明白爲什麼它說:Foo * *到Foo * [4]。如果作爲函數參數互相交換,爲什麼在賦值期間,它給我編譯錯誤?

我試着用最少的代碼複製的錯誤味精如下:

#include <iostream> 

using namespace std; 

struct Foo 
{ 
int id; 
}; 

void getResult(Foo** fooPtrArray) 
{ 
cout << "I am in getResult" << endl; 
Foo* fooPtrArray1[4]; 
fooPtrArray1 = fooPtrArray; 
} 

int main() 
{ 
Foo* fooPtrArray[4]; 
getResult(fooPtrArray); 
} 
+0

定義「失敗」。在編譯時失敗?在運行時?如何,完全(或隱約地,我不介意)? – 2009-11-12 11:27:52

+0

如上所示,我附上我的修剪過的代碼,這是編譯時錯誤。錯誤來自函數void getResult(Foo * * fooPtrArray) – Lily 2009-11-12 17:31:26

回答

10

兩個

int getResult(Foo** fooPtrArray) 

int getResult(Foo* fooPtrArray[]) 

以及

int getResult(Foo* fooPtrArray[4]) 

將工作得很好(他們都是等效的)。

從您的問題中不清楚是什麼問題。什麼「失敗」?

當通過像,它通常是有意義的具有允許所述陣列類型declay到指針類型通常專門用於允許不同尺寸的傳遞數組傳遞的元素計數,以及,由於特技陣列

int getResult(Foo* fooPtrArray[], unsigned n); 
... 
Foo* array3[3]; 
Foo* array5[5]; 
getResult(array3, 3); 
getResult(array5, 5); 

但如果你總是要通過嚴格的4個元素的數組,這可能是一個更好的主意,使用不同類型的指針作爲參數

int getResult(Foo* (*fooPtrArray)[4]) 

在後一種情況下,函數調用將loook如下

Foo* array[4]; 
getResult(&array); 

(注意應用於數組對象的&運算符)。

最後,因爲這個問題被標記爲C++,在後一種情況下的參考,也可以用來代替指針

int getResult(Foo* (&fooPtrArray)[4]); 
... 
Foo* array[4]; 
getResult(array); 
+0

這看起來有趣:帶有兩個星號和一個括號對的'int getResult(Foo *(* fooPtrArray)[4])'。那是對的嗎? – ndim 2009-11-12 00:55:01

+0

是的,這是正確的。但在C++中,引用(而不是指針)在這種情況下可能更合適(請參閱答案中的adidtional註釋)。 – AnT 2009-11-12 01:01:01

+0

你能否詳細說明'Foo *(&fooPtrArray)[4]'如何被解析,以及如何從函數體內調用fooPtrArray? – int3 2009-11-12 06:28:28

0

的這兩項功能的簽名看起來像他們應該工作。當調用該函數,你會做這樣的事情:

int returnValue; 
returnValue = getResult(fooPtrArray); 
2

您使用以下行宣佈什麼:

Foo* fooPtrArray[4]; 

是一個指針數組Foo對象(即數組Foo*)。

在C/C++中,數組的名稱被定義爲指向數組開頭的指針。這是因爲數組在這些語言中不是「真實的」類型,而只是內存中特定類型的連續值。

在這種情況下名稱fooPtrArray將是一個「指向第一個指針」的數組,這是指針數組存儲位置的起始位置。

所以無論你上面列出的函數原型應該工作。但是,在將數組傳遞給函數時,您總是需要傳遞大小,因此函數會知道其中有多少個元素。所以,你應該定義你的方法是這樣的:

int getResult(Foo** fooPtrArray, int arraySize); 

在這個函數中,您可以訪問個人Foo指針(以及隨後Foo對象)數組中像這樣:

for (int i=0; i < arraySize; i++) 
{ 
    Foo* fooPtr = fooPtrArray[i]; 
    if (fooPtr) 
    { 
     fooPtr->memberFunction(); 
     fooPtr->memberVariable; 
    } 
} 
0

我看不出如何在不返回int的情況下編譯?

@Kinopiko你的代碼不能用C++編譯。

@Lily你得到的錯誤信息是什麼?你的例子中的 getResult需要返回一個int。這可能是失敗的。