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

+0

은 단지 속기 일뿐입니다. (int i = 0; i <6; i ++) {...} – Leonardo

+0

실제 코드를 보여 주시겠습니까? –

답변

3

간단히 말해서 sometimes, C의 배열 이름이 배열의 첫 번째 요소에 대한 포인터로 "쇠퇴"하여 문제의 원인이됩니다.

에는 RHS에

response=origin; 

이름 origin을 작성할 때 "붕괴"response가 형인 반면 origin 어레이의 첫 번째 요소 유형 Line *, 포인트이어야 "배열 [6]의 선". 두 유형은 호환되지 않기 때문에 (포인터로 배열을 초기화하는 것은 의미가 없습니다) 오류입니다. 이제

,
*response=*origin; 

responseorigin의 모든 메모리를 복사하지 않습니다. 위에서 언급했듯이 위의 링크에서 더 자세히 설명한 것처럼 originorigin 배열의 첫 번째 요소를 가리키고 있으므로 *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, 철자 수정에 감사드립니다. –

+0

이 설명에 감사 드리며 방금 투표했습니다. 자바에서 다른 객체 지향 언어와 마찬가지로, 당신은 objectx = objecty를 쓸 때 동일한 객체에 대한 두 개의 참조가 있다는 것을 잘 알고있을 것입니다. 나는 C와 같은 비 객체 지향 언어에서 수행하는 방법을 배우는 선호하는 방법으로 objective-c를 사용하여이를 달성하려고 노력하고있었습니다. – Leonardo

+0

s/memset/memcpy –