指针数组作为函数参数

问题描述:

我对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

两个

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

的这两项功能的签名看起来像他们应该工作。当调用该函数,你会做这样的事情:

int returnValue; 
returnValue = getResult(fooPtrArray); 

您使用以下行宣布什么:

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; 
    } 
} 

顶一个编译OK:

http://codepad.org/KOcnpmtv

第二个是也没关系:

http://codepad.org/7OSqprYI

我看不出如何在不返回int的情况下编译?

@Kinopiko你的代码不能用C++编译。

@Lily你得到的错误信息是什么?你的例子中的 getResult需要返回一个int。这可能是失败的。