指针数组作为函数参数
我对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);
}
两个
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);
的这两项功能的签名看起来像他们应该工作。当调用该函数,你会做这样的事情:
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;
}
}
我看不出如何在不返回int的情况下编译?
@Kinopiko你的代码不能用C++编译。
@Lily你得到的错误信息是什么?你的例子中的 getResult需要返回一个int。这可能是失败的。
定义“失败”。在编译时失败?在运行时?如何,完全(或隐约地,我不介意)? – 2009-11-12 11:27:52
如上所示,我附上我的修剪过的代码,这是编译时错误。错误来自函数void getResult(Foo * * fooPtrArray) – Lily 2009-11-12 17:31:26