2010-02-03 25 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