첫 번째 코드 샘플에서 변수 node
은 Node
구조체에 대한 포인터입니다. Node
구조체가 저장된 메모리 위치의 주소를 포함합니다.
두 번째 코드 샘플에서 변수 node
은 Node
구조체에 대한 포인터에 대한 포인터입니다. Node
구조체가 저장된 메모리 위치의 주소를 포함하는 메모리 위치의 주소를 포함합니다.
두 코드 샘플에서 변수 이름이 동일하고 거의 동일하므로 다소 혼란 스럽습니다. Node
입니다. 포인터의 의미가 명확 해 지도록 코드 샘플을 다시 작성해 보겠습니다.
첫번째 경우 :
Node* node_pointer = head;
while (node_pointer != NULL) {
// node_pointer points to a Node
// do something to that Node, then advance to the next element in the list
// ... something ...
node_pointer = node_pointer->next; // advance
}
번째 경우 : 두 경우
Node** node_pointer_pointer = &head;
while (*node_pointer_pointer != NULL) {
// node_pointer_pointer points to a pointer which points to a Node
// do something to that Node, then advance to the next element in the list
// ... something ...
node_pointer_pointer = &((*node_pointer_pointer)->next); // advance
}
는 가변 head
는 Node
구조체에 대한 포인터이다.
node_pointer = head;
그리고 두 번째 경우, &
운영자가 head
의 메모리 위치를 가져 오는 데 사용됩니다 : A는 무엇
node_pointer_pointer = &head;
를 그 값이 첫 번째 경우에 node_pointer
에 직접 할당되는 이유 Node
? 에 대한 포인터 인 struct (아마도 다른 것들과 함께) 필드 next
이 있습니다. 첫 번째 코드 샘플에서는 next
의 값을 node_pointer
에 직접 할당 할 수 있지만 두 번째 코드 샘플에서는 &
연산자로 참조해야합니다.
두 번째 접근 방식이 유용한 이유는 무엇입니까? 이 예에서는 그렇지 않습니다. 연결된 목록의 요소를 반복하려는 경우 Node
구조체에 대한 포인터 만 있으면됩니다.
그러나 하위 포인터를 조작하려는 경우 포인터에 대한 포인터를 갖는 것이 유용합니다. 예를 들어 목록 탐색이 끝났다고 가정하고 이제 꼬리에 새 노드를 추가하려고합니다.
위의 첫 번째 경우에서 node_pointer
은 그 값이 NULL
이기 때문에 도움이되지 않습니다. 더 이상 아무것도 할 수 없습니다.
두 번째 경우 *node_pointer_pointer
의 값이 NULL
인 동안 node_pointer_pointer
의 값은 아닙니다. 목록의 마지막 노드에있는 next
필드의 주소입니다.따라서, 우리는 next
에 새 Node
구조체의 주소를 할당 할 수
*node_pointer_pointer = make_new_node(); // make_new_node() returns a pointer
참고 별표, 또는 역 참조 연산자를 *node_pointer_pointer
에. node_pointer_pointer
을 참조하면 next
포인터가 생성되고 새로운 Node
구조체의 주소를 할당 할 수 있습니다.
또한이 할당은 node_pointer_pointer
이 빈 목록의 헤드를 가리키는 경우 작동합니다. 이를 역 참조하면 head
이되고 새로운 Node
구조체의 주소를 할당 할 수 있습니다.
실제 어셈블리 코드를 보는 좋은 사례입니다. 그것의 ok 당신이 처음에 그것을 이해하지 않는다면, 단지 조립 라인의 수에 델타는 합리적인 지표입니다. 나는 종종 작은 샘플을 http://gcc.godbolt.org/에 붙여 넣는다. 그 필터는 -S로 컴파일하는 것보다 편리하게 만드는 필터를 가지고있다. – technosaurus