2014-07-22 6 views
2

단일 링크 된 목록에 항목을 추가하기 위해이 연결된 목록 루틴 (Haviland의 Unix System Programming에서)을 발견했습니다.포인터를 포인터로 포인터

additem(item **head, item *newitem) 
{ 
    newitem->next = *head; 
    *head = newitem; 
} 

제게 어려움이있는 부분은 item **head입니다. **head은 실제로 무엇을 의미합니까?

additem(item *head, item *newitem) 
{ 
    newitem->next = head; 
    head = newitem; 
} 

답변

3

그것은 포인터에 대한 포인터입니다 다음과 같이 이유는 단지 item *head으로 루틴을 정의하지.

C에서는 매개 변수가 로컬 변수로 처리되므로 값으로 전달 된 변수는 변경할 수 없습니다. 대신 포인터를 전달한 다음 *variable 값을 수정해야합니다.

변경하려는 변수가 이미 포인터 인 경우에도 적용됩니다. 이 경우 해당 포인터에 포인터를 전달해야하므로이 포인터를 변경하면이 변경 사항이 호출자에게 전파됩니다.

*headhead을 가리키고 있습니다. headitem **이고 *headitem *입니다.

당신이 할 때 :

additem(item *head, item *newitem) 
{ 
    newitem->next = head; 
    head = newitem; 
} 

head의 값을 수정은 호출자에게 값의 영향을주지 않습니다. 모든 맥락에서 head을 변경하는 것은 의미가 없습니다.

0

방금 ​​포인터 *head을 자식 루틴에 전달하고 해당 값을 변경하고 반환하려고하면 루틴의 스택에있는 루틴에 전달 된 값이기 때문에 찾을 수 없습니다. 루틴은 범위 내에 있습니다. 그러나 해당 포인터에 대한 포인터 (**head, 스택에서도 로컬로 위치 함)를 전달하고 포인터가 가리키는 값을 변경 한 다음 호출 루틴의 범위에서 변경하려는 값을 변경할 수 있습니다 실제로 변경됩니다.

C가 공식적으로 값 별 호출 —을 공식적으로 지원하기 만해도 참조로 전화를 걸 수있는 'C 방식'입니다. 원하는 값에 대한 값인 call-by-value를 사용합니다 변경하여 참조 호출을 허용합니다.

1

제목에 첫 번째 질문의 답이 있습니다. item **headhead이 포인터를 가리키는 것을 의미합니다.

두 번째 코드 스 니펫이 작동하지 않는 이유는 무엇입니까?

head = newitem; 

코드가 할 의도되지 않은 어떤 지역 변수 head에 값을 할당하기 때문이다.

0

간단히 이해하면 : 다른 함수가 변수 값을 변경하려는 경우. C는 "call by value" 메커니즘을 사용하기 때문에 주소를 전달해야합니다.이 경우

void change_value(type *a) 
{ 
    *a = ...; 
} 

, 당신은 머리 유형 (머리 *)에 대한 포인터의 값을 변경하려면, 그래서 그 요지는 **

유형을 머리의 유형이 * 동일 (머리 *) *는 또는 머리 **

관련 문제