【问题标题】:Array of pointers in objective-cObjective-C中的指针数组
【发布时间】:2010-03-31 02:09:32
【问题描述】:

我对 Objective-c 中的指针感到困惑。

基本上我的代码中有一堆静态数据。

static int dataSet0[2][2] = {{0, 1}, {2, 3}};
static int dataSet1[2][2] = {{4, 5}, {6, 7}};

我想要一个数组来索引它。

dataSets[0]; //Would give me dataSet0...

数据集的类型应该是什么,我将如何初始化它?

【问题讨论】:

  • 谢谢大家,这一切都非常有帮助。

标签: objective-c pointers multidimensional-array


【解决方案1】:

虽然它在内存中的布局相同,但指向多维数组的指针与指向平面数组的指针不同。编译器必须将 [][] 索引转换为任何多维数组的平面数组索引。不能将两者混合使用,否则编译器的区别会丢失。您可以使用所有平面数组:

  static int dataSet00[2] = {0,1};
  static int dataSet01[2] = {2,3};
  static int * dataSet0[2] = {dataSet00, dataSet01};

  static int dataSet10[2] = {4, 5};
  static int dataSet11[2] = {6, 7};
  static int * dataSet1[2] = {dataSet10, dataSet11};

  static int ** dataSets[2] = {dataSet0, dataSet1};

或一个大的多维数组:

  static int dataSets[2][2][2] = {{{0,1},{2,3}},{{4,5},{6,7}}};

但不是两者的组合,除非您根据 Jon 的建议通过声明特殊数据类型来提示编译器。

【讨论】:

  • 在内存中的布局相同。在多维数组中,它都在连续的内存中,编译器使用行长度的知识来确定指针算术的偏移量。使用您的其他方法(int * 和 int **),您实际上必须在每个索引级别上取消引用指针。
  • @sblom 是对的,它们在结构上非常不同。不过,奇怪的是,据我所知,帖子的其余部分(示例和所有)在其他方面都是 100% 正确的。
  • 啊 - 是的,这两种方法的布局肯定会有所不同。第一句话说虽然 {{1,2},{3,4}} 和 {1,2,3,4} 的布局相同,但它们在编译时有一个重要的区别,这会阻止它们被互换分配。
【解决方案2】:

指向多维数组的指针可能很棘手。 typedef 可以提供帮助:

typedef int (*DataSetType)[2];
DataSetType dataSets[] = { dataSet0, dataSet1 /* and so on*/ };

【讨论】:

    【解决方案3】:

    您可以使用NSPointerArray

    【讨论】:

      【解决方案4】:

      您的索引数组将是一个指向 int 指针的指针数组。

      所以声明看起来像:

      int ** dataset[numOfDataSets] = {dataSet0, dataSet1, ...}
      

      请记住,objective-c 是 ansi-c 的适当超集,这个问题特别是关于 c 语言的,真的。

      编辑:重要的是要记住,在 C 中,数组本质上只是指针,而二维数组是指向指针的指针。

      编辑 2:我认为实际上我抑制了运算符优先级。应该是:

      int (** dataset)[numOfDataSets] = {dataSet0, dataSet1, ...}
      

      【讨论】:

      • 确实有效,谢谢。但是,它会发出警告:initialization from incompatible pointer type。知道如何清除它吗?
      • @Justin:我认为我犯了运算符优先级错误。请参阅编辑后的解决方案。
      • dataSet0 和 dataSet1 实际上并不是指针数组(因此 int ** 不起作用)——它们只是方便访问的平面数组。
      • @dbarker 是对的。声明 dataset0 和 dataset1 的方式,编译器至少需要知道数据集数组的行宽。它们都必须相同。
      猜你喜欢
      • 1970-01-01
      • 2010-12-19
      • 2011-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-26
      相关资源
      最近更新 更多