2015-03-01 1 views
1

В принципе, я хочу знать, почему это (передавая адрес памяти списка в качестве параметра):В чем разница между передачей и var в * var и var в var?

void init_lista (elemPtr *list) { 
    *list = NULL; 
} 
int main(){ 
    elemPtr list; 
    init_list(&list); 
    //[...] 
} 

отличается, чем это (передача только содержание списка):

void init_lista (elemPtr list) { 
    list = NULL; 
} 
int main(){ 
    elemPtr list; 
    init_list(list); 
    //[...] 
} 

OBS : elemPtr - тип указателя структуры (typedef struct elem *elemPtr).

То, что я понимаю из & и *, состоит в том, что первый получит адрес памяти var, а последний получит значение, на которое оно ссылается. По этой концепции оба раздела кода должны быть эквивалентными, но первый работает отлично, а второй компилирует, но дает мне ошибку времени выполнения. Почему это?

+1

Что такое elemPtr? Это typedef для какого-то указателя? –

+1

Это хорошо написано в книге программирования C. –

+0

И объяснение этого зависит от ваших прежних знаний и может занимать несколько страниц. –

ответ

1

В этой функции

void init_lista (elemPtr list) { 
    list = NULL; 
} 

list является локальной переменной функции. Вы можете себе это представить

void init_lista() { 
    elemPtr list = NULL; 
} 

, который после выхода из функции будет уничтожен. Исходный аргумент не будет изменен, поскольку он передается функции по значению. Таким образом, функция имеет дело с копией исходного объекта.

В этой функции

void init_lista (elemPtr *list) { 
    *list = NULL; 
} 

пройдена указатель на исходный объект. Поэтому изменение аргумента с помощью этого указателя будет сделано для исходного объекта.

+0

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

+0

@xVictor Это ссылка для объекта, на который он указывает, но не для себя. –