【问题标题】:Understanding arrays in Objective-C / C理解 Objective-C / C 中的数组
【发布时间】:2010-02-03 08:46:37
【问题描述】:

我刚刚迈出了进入Objective-C 的第一步。我有一个关于数组如何工作的非常简单的问题。

我有两个 .m 文件:

1)

Line = origin[6];
forloop(i...i++) {
    origin[i]=7;
}
[buildSubview:origin];

2)

Line response[6]; 

-(id)buildSubview:(Line[])origin {
    *response=*origin;
    NSLog(@"response[1]=%o",response[1]);
    NSLog(@"origin[1]=%o",origin[1]);
    ........
    .....
}

我得到的输出是:

response[1]=0; <-- I would expect the same value as origin
origin[1]=7;

但如果我要求打印索引 0 处的值,我会得到预期的结果:

response[0]=7; <-- Now they are the same
origin[0]=7;

我问为什么有两个不同的值?还有,为什么我要写

response=origin;

我得到一个不兼容的赋值编译错误?

【问题讨论】:

  • 什么是forloop指令?
  • 只是一个简写,我的意思是 for(int i=0;i
  • 你为什么不给我们看真实的代码?
  • 抱歉,我认为问题的核心已经足够清晰,没有真正的代码。下次我会添加完整的列表。

标签: objective-c arrays variable-assignment


【解决方案1】:

简而言之,sometimes,C 中的数组名称“衰减”为指向数组第一个元素的指针,这给您带来了麻烦。

当你写作时

response=origin;

RHS 上的名称origin“衰减”为Line * 类型,并指向origin 数组的第一个元素,而response 的类型为“行数组[6]”。由于这两种类型不兼容(用指针初始化数组没有意义),所以报错。

现在,

*response=*origin;

不会将origin 中的所有内存复制到response。正如我上面提到的,在上面的链接中有更详细的说明,origin 在这个上下文中指向origin 数组的第一个元素,所以*origin 实际上是数组的第一个元素。因此,*response=*origin; 只是将origin 数组的第一个元素的值复制到response 的第一个元素中。由于您尚未为 response[1] 赋值,因此它包含垃圾。

如果你想把数组数据复制过来,你可以做一个循环:

size_t i;
for (i=0; i < 6; ++i)
    response[i] = origin[i];

或者,您可以使用memcpy()

memcpy(response, origin, sizeof response);

(以上是针对C的,Objective-C可能有区别和其他方式做你想做的事。)

【讨论】:

  • 感谢您的清晰解释,我刚刚投了票。在 java 中和在其他一些面向对象的语言中一样,您可能很清楚,当我编写 objectx=objecty 时,我得到了对同一个对象的两个引用。我试图通过 Objective-c 来实现这一目标,并以一种首选的方式来学习如何用 C 等非面向对象的语言来做事。
  • @Paul:谢谢!现在是时候把自己“安顿”在床上了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多