Intereting Posts
Как xor две строки в C? Алгоритм для решения схемы электроснабжения Последовательное пустое пространство Удаление в C Можно ли программным образом получить подпись функции в общей библиотеке? читать строку за строкой из буфера сокета Как читать только цифры от ввода (без букв, цифр) в C? Почему printf печатает случайное значение с помощью спецификатора формата float и integer разработать систему, поддерживающую массовое хранение данных и запрос Как использовать язык программирования C, создающий оболочку, которая может реализовать историю захвата стрелки? Могу ли я определить переменную среды и использовать ее в условной компиляции? Случайный охват шкафа Зачем использовать перечисление, когда #define так же эффективно? Повреждение кучи – ошибка отладки не удалась. в выражении dbgheap.c 1322 выражение _crtIsValidHeapPointer (pUserData) В чем проблема с этим кодом? Как правильно преобразовать Hex-строку в байт-массив в C?

В чем разница между передачей и 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, а второй получит значение, на которое оно ссылается. По этой концепции оба раздела кода должны быть эквивалентными, но первый работает отлично, а второй компилирует, но дает мне ошибку времени выполнения. Это почему?

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

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

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

     void init_lista () { elemPtr list = NULL; } 

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

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

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

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