伊达的地址作为论据

时间:2011-04-06 19:23:25

标签: iphone c pointers

我试图调用函数但是我收到错误:

  

警告:从不兼容的指针类型

传递'drawPlot'的参数1
//call
    drawPlot(&listData);


//header
    void drawPlot(NSMutableArray*);

listData当然是NSMutableArray

2 个答案:

答案 0 :(得分:2)

删除&amp ;.你的变量已经是一个指针。我假设你已经宣布它是这样的:NSMutableArray *listData;

所以使用&将一个“指向指针的指针”传递给一个期望只是一个指向NSMutableArray的指针的函数。

现在,SDK中有许多地方需要NSError **。这就是你要使用&amp ;,例如:

NSError *error = nil;
...
[SomeClass doSomethingReturningError:&error];
if (error != nil) {
    //something bad happened
}

所以,这里的区别在于,在你的情况下,传递listData按值传递对象。变量的值本身不能被修改(但是数组的内容可以是)。另一种情况(&error)通过引用传递,这意味着可以修改变量的值,即指针本身。这就是为什么你可以将结果(在这种情况下)与nil进行比较,以查看是否出现了问题。

一个更简单的例子是比较以下之间的差异:

void changeIntByValue(int i)
{
    i++;
}

void changeIntByReference(int &i)
{
    i++;
}

int x=2;
changeIntByValue(x);
NSLog(@"%d", x); // prints 2
changeIntByReference(&x);
NSLog(@"%d", x); // prints 3

按值传递不允许修改参数,而通过引用传递。

答案 1 :(得分:-1)

listData的定义应该类似于:

NSMutableAarray listData;  //OR 
NSMutableAarray listData[]; 

如果是前者,则将drawPlot调用更改为

drawPlot(&listData[0])  // OR
drawPlot(listData)

如果是后者,则将drawPlot调用更改为

drawPlot(&listData [ the index of the listData array member you want to plot]);  // does it work now?