2017-04-04 6 views
0

의 핵심 코드를 읽을 때 포인터를 가리키는 불필요한 포인터가 보이지 않습니다. tcp/ip 일러스트 v2를 읽고 책의 일련의 코드와 혼동합니다. 당신이 저자가이 곳에서 포인터에 대한 포인터를 사용하는 이유는 문제vs4 4.4

void if_attach(struct ifnet* ifp){ 
    struct ifnet **p = &ifnet; 
    while(*p): 
     p = &((*p)->if_next); 
    *p = ifp; 

에 대한 자세한 내용은 도움이 될 수 있습니다 구조의 배경 정보는 여기

struct ifnet{ 
    struct ifnet * if_next; 
    …… 
} 

입니까? 나는 나머지 텍스트에서 p가 결코 다시 나타나지 않는다고 약속한다. (이는 어떤 함수의 인수로도 사용되지 않는다는 것을 의미한다). 제 생각에는

이 코드는이

struct ifnet *p = ifnet; 
while(p): 
    p = *p->if_next; 
p = ifp; 

로 변환 할 수는 그 거 맞아?

+0

변수'p'는 지역 변수입니다. 'struct ifnet * p' 만 가지고 있다면 그 지역 변수 만 수정하면 함수가 끝나면 변경 사항이 사라지게됩니다. 포인터를 가리키는 포인터를 사용하면'* p'를 영구적으로 변경하면'p '가 가리키는 포인터가 변경됩니다. 이 경우 연결된 목록에 노드를 추가합니다. –

+0

감사합니다. – WaldenShen

답변

0

필자는 포인터를 포인터로 사용하여 추상화에 영향을주는 공통점을 발견했습니다. 그것은 노드가 아닌 "링크로 목록 이동"입니다.

링크 된 목록 데이터 구조가 포인터에 의해 참조되는 경우 헤드 노드에서 삽입 또는 삭제가 발생하는 경우 해당 포인터를 함수에 전달해야한다는 것을 분명히 알고 있습니다. 그렇지 않으면 해당 노드의 내부 포인터를 수정합니다.

하지만 내부 노드 포인터를 노드를 통해 액세스하는 대신 주소로도 참조하면 어떻게됩니까? 음, 코드는 헤드 노드와 모든 내부 노드에서 동일하게됩니다.