2010-02-03 61 views
1

我刚刚完成了第一步,进入Objective-C。我有一个关于数组如何工作的非常简单的问题。了解Objective-C/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; 

我得到一个不兼容的分配编译错误?

+0

什么是'forloop'指令? – mouviciel 2010-02-03 08:57:07

+0

只是一个简写,我的意思是(int i = 0; i <6; i ++){...} – Leonardo 2010-02-03 09:19:21

+0

为什么不给我们展示真正的代码? – 2010-02-03 09:28:21

回答

3

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

当编写

response=origin; 

名称origin在RHS“衰减”是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可能有差异和其他方式做你想做的事情。)

+0

@Peter,感谢您的拼写修正。 – 2010-02-03 09:08:22

+0

感谢这个清晰的解释,我只是投了票。在java中和其他一些面向对象的语言一样,你可能知道当我写objectx = objecty时,我得到了两个对同一个对象的引用。我试图通过objective-c来实现这个目标,并且学习如何使用非面向对象的语言如C编写的首选方法。 – Leonardo 2010-02-03 09:09:33

+0

s/memset/memcpy – 2010-02-03 09:29:19