【问题标题】:address of ivar as an argument作为参数的 ivar 地址
【发布时间】:2011-04-06 19:23:25
【问题描述】:

我正在尝试调用函数,但出现错误:

警告:从不兼容的指针类型传递“drawPlot”的参数 1

//call
    drawPlot(&listData);


//header
    void drawPlot(NSMutableArray*);

listData 当然是 N​​SMutableArray

【问题讨论】:

  • 你确定不是NSMutableArray*
  • 当然是我的错,应该是没有和号的listData。

标签: iphone c pointers


【解决方案1】:

删除 &。您的变量已经是一个指针。我假设你已经这样声明了:NSMutableArray *listData;

因此,使用 & 将“指向指针的指针”传递给一个函数,该函数只需要一个指向 NSMutableArray 的指针。

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

NSError *error = nil; ... [SomeClass doSomethingReturningError:&error]; 如果(错误!= nil){ //发生了不好的事情 }

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

一个更简单的例子是比较下面的区别:

无效 changeIntByValue(int i) { 我++; } 无效 changeIntByReference(int &i) { 我++; } 诠释 x=2; changeIntByValue(x); NSLog(@"%d", x); // 打印 2 changeIntByReference(&x); NSLog(@"%d", x); // 打印 3

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

【讨论】:

    【解决方案2】:

    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?  
    

    【讨论】:

      猜你喜欢
      • 2012-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-05
      • 2020-02-29
      • 2015-05-04
      • 2012-12-06
      • 2018-05-26
      相关资源
      最近更新 更多