指针数组作为函数参数

时间:2009-11-12 00:28:50

标签: c++ arrays function pointers

我对C / C ++中的数组和指针有一个基本的问题。

说我有:

Foo* fooPtrArray[4];

如何将fooPtrArray传递给函数? 我试过了:

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

如何处理指针数组?

编辑:我曾经认为错误msg来自传递错误的指针数组,但是从所有响应中,我意识到它是其他东西......(指针赋值)

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

5 个答案:

答案 0 :(得分:11)

两者

int getResult(Foo** fooPtrArray)

int getResult(Foo* fooPtrArray[])

以及

int getResult(Foo* fooPtrArray[4])

将完美地工作(它们都是等效的)。

从您的问题中不清楚问题是什么。什么“失败”?

当传递这样的数组时,通常也有理由传递元素数,因为允许数组类型拒绝指针类型的技巧通常专门用于允许传递不同大小的数组

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

但是如果你总是要传递严格的4个元素的数组,那么使用不同类型的指针作为参数可能是个更好的主意

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

在后一种情况下,函数调用将如下所示

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

(注意应用于数组对象的&运算符)。

最后,由于这个问题被标记为C ++,在后一种情况下,也可以使用引用而不是指针

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

答案 1 :(得分: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;
    }
}

答案 2 :(得分:0)

这两个功能签名看起来都应该有效。调用函数时,你会做这样的事情:

int returnValue;
returnValue = getResult(fooPtrArray);

答案 3 :(得分:0)

最上面的一个编译好了:

http://codepad.org/KOcnpmtv

第二个也可以:

http://codepad.org/7OSqprYI

答案 4 :(得分:0)

我没有看到如果没有返回int会如何编译?!

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

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