2012-08-27 4 views
1

나는 C에서 이중 연결 목록으로 작업하고 있는데, 나는 항상 사실로 받아 들여지거나 한 번 해답을 알고 잊어 버렸다고 깨달은 무언가를 발견했다. 포인터를 다시 사용하기 시작하면 매번 다시 학습해야합니다.구조체에서 전달 포인터에 추가 참조가 필요하지 않은 이유는 무엇입니까?

int insert (char *title, video **head, video **tail); 

와 I가 왜 궁금 오전 : 삽입에 대한

typedef struct video 
{ 
    char title[MAX_TITLE_LENGTH]; 
    struct video *prev; 
    struct video *next; 
}video; 

프로토 타입 :

int main(void) 
{ 
    video *head = NULL; 
    video *tail = NULL; 

    char *buffer = NULL; 
    buffer = (char*)malloc(sizeof(MAX_TITLE_LENGTH)); 

    printf("Enter a title: "); 
    fgets(buffer, MAX_TITLE_LENGTH, stdin); 

    insert(buffer, &head, &tail); 
} 

나는 구조를 가지고 : 여기

내 설치의 기본이다 비디오 *의 주소를 구체적으로 전달하십시오.

나는 char를 전달하는 방법을 알고, 문자열의 시작 부분의 메모리에 주소를 전달합니다. 값에 액세스하기 위해 머리와 꼬리를 다시 참조 해제해야하는 이유는 무엇입니까?

이것은 솔직히 내가 생각하는 것보다 더 간단합니다. 확신 할 수 있습니다. 나는 포인터에 대해 생각하는 나쁜 지점에 두뇌를 가지고 있습니다.

누구나 쉽게 풀 수 있습니까?

감사합니다. 기능 insert이 무슨 headtail 점을 을 변경해야 할 수도 있기 때문에

답변

5

그것은이다.

C에서 함수 매개 변수는 값 별 전달이라는 것을 기억하십시오. 이런 이유로 함수에서 변경하려는 struct에 대한 포인터를 전달합니다. 포인터를 제공하면 함수가 메모리의 실제 구조에 액세스 할 수 있습니다.

그러나 struct에 대한 포인터는 값으로 전달됩니다. 포인터 이 가리키는 포인터를으로 바꾸려면 어떻게해야합니까? 추가 레벨의 참조 또는 실제로 포인터를 보유하는 메모리가 필요하므로 단순히 복사되지 않습니다. 추가 레벨 인 reference를 사용하면 포인터를 함수에 변경하기위한 포인터에 액세스 할 수 있으며 포인터가 다른 포인터를 가리킬 수 있습니다.

링크 된 목록 코드에서이를 자주 볼 수 있습니다. head 요소 : 목록의 다른 모든 요소는 아마도 목록의 각 노드에 포함 된 포인터를 사용하여 액세스 할 수 있습니다. 머리에 새로운 요소를 삽입하면, 변경이 헤드 포인터가 필요합니다. 함수 매개 변수로 전달하면 주소가 필요합니다. 그렇지 않으면 함수가 사본을 변경하기 만하며 변경 사항은 함수 외부에 반영되지 않습니다.

+0

나는 그것을 실제로 얻는다. 좋은 답변으로 시간을내어 주셔서 감사합니다. 나는 이전의 이중 링크 된 목록 코드를 수정하여 뭔가 다른 것을 저장하려고하고 어떻게 작동했는지 잊어 버렸기 때문에 여러분은 그것이 정확히 무엇인지 알아 냈습니다! – Steve