2014-01-09 2 views
2

У меня есть вопрос о прохождении через указатели в C. Я проиллюстрирую мой вопрос через этот фрагмент кода, который я написал:Проходя мимо указателя в C

int main() { 
    List *head = (List *)malloc(sizeof(List)); 
    head->data = 0; 
    head->next = NULL; 
    insertEnd(head, 3); 
    //List *temp = head; 
    insertEnd(head, 4); 
    PrintList(temp); 
    return 0; 
} 

void insertEnd(List *node, int elem) { 
    while (node->next != NULL) { 
     node = node->next; 
    } 
    List *new_node = (List *)malloc(sizeof(List)); 
    new_node->data = elem; 
    new_node->next = NULL; 
    node->next = new_node; 
} 

void PrintList(List *node) { 
    while (node) { 
     printf ("%i ->", node->data); 
     node = node->next; 
    } 
} 

В приведенном выше фрагменте кода, я создаю указатель Список и переместите его в мою функцию insertEnd() два раза. Если вы заметили в моей функции insertEnd(), я на самом деле перемещаю это переданное в указателе, выполняя «node-> next»

Если я меняю адрес, этот указатель указывает на мою функцию insertEnd(), тогда как получилось, когда я вызываю PrintList() так, как если бы расположение указателей не перемещалось!

перечень печать() возвращает: «0 -> 3 -> 4 ->»

Является ли это потому, что, проходя мимо указателя, вы фактически передавая новую физическую копию указателя в функцию, аналогичную Попутно по значению, кроме как в этом случае вместо копирования по всей структуре данных/данных, вы просто копируете переменную указателя? Я надеюсь, что это имеет смысл ..

+1

Ваше объяснение кажется правильным для меня. Вы передаете значение указателя в качестве параметра, который позволяет вам изменять данные, на которые указывает указатель, но не сам указатель. –

+0

Да, это то, что я думал, но возиться с C, заставил меня угадать мои основы. Я в основном кодирую языки гораздо более высокого уровня, поэтому его новое для меня – AyBayBay

+0

Кроме того: [не выдавать результат malloc] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of -malloc). – pzaenger

ответ

2

Да, когда вы передаете указатель в качестве аргумента функции значение адреса копируется, так что если вы делаете:

void foo(int *f) { 
    f = malloc(sizeof(int)); 
    printf("%d\n", f); 
} 

void goo() { 
    int *p = malloc(sizeof(int)); 
    foo(p); 
    printf("%d\n", p); 
} 

они будут печатать различные результаты. Это будет таким же в вашем примере, когда вы передадите head функциям, адрес которых скопирован в аргумент функции node. Изменения в значениях node не повлияют на значение head (Только если вы измените значение, указанное этими переменными, то, если они укажут на тот же адрес, то оба *head и *node покажут то же самое).

Смежные вопросы