10 ответов:
нулевой указатель является специальным зарезервированным стоимостью указателя. Указатель любого типа имеет такое зарезервированное значение. Формально, каждый конкретный тип указателя (
int *,char *etc.) имеет свое собственное выделенное значение нулевого указателя. Концептуально, когда указатель имеет это нулевое значение, он никуда не указывает.пустой указатель - это конкретный указатель тип -
void *- указатель, указывающий на некоторое место данных в хранилище, которое не имеет никакого конкретного типа.Итак, еще раз нулевой указатель это стоимостью, а пустой указатель это тип. Эти понятия совершенно разные и несопоставимые. Это по существу означает, что ваш вопрос, как указано, не совсем корректен. Это все равно что спросить, например: "в чем разница между треугольником и автомобилем?".
Это два разных понятия:" указатель void " - это тип (void *). "нулевой указатель" - это указатель, имеющий нулевое значение (NULL). Пример:
void *pointer = NULL;это указатель NULL void.
нулевой указатель гарантированно не будет сравниваться с указателем на любой объект. Это фактическое значение зависит от системы и может варьироваться в зависимости от типа. Чтобы получить null
intуказатель, вы могли бы сделатьint* p = 0;нулевой указатель будет возвращен
mallocна провал.мы можем проверить, если указатель равен null, т. е. если
mallocили какая-то другая функция не удалось просто проверить его логическое значение:if (p) { /* Pointer is not null */ } else { /* Pointer is null */ }пустой указатель может указывать на любой тип и до вас, чтобы обработать, сколько памяти ссылочные объекты потребляют для разыменования и арифметики указателя.
Void относится к типу. В основном тип данных, на которые он указывает, неизвестен.
Null относится к значению. Это по сути указатель на ничто, и недопустимо использовать.
нулевой указатель имеет значение
NULLкоторый обычно равен 0, но в любом случае является ячейкой памяти, которая недопустима для разыменования. Пустой указатель указывает на данные типа Void. Слово "void" не указывает на то, что данные, на которые ссылается указатель, являются недопустимыми или что указатель был обнулен.
обычно нулевой указатель (который может быть любого типа, включая указатель void !) указывает на:
адрес 0, против которого большинство наборов инструкций CPU может выполнять очень быстрое сравнение и ветвление (например, для проверки неинициализированных или недопустимых указателей) с оптимальным размером кода/производительностью для ISA.
адрес, который является незаконным для пользовательского кода для доступа (например, 0x00000000 во многих случаях), так что если код действительно пытается получить доступ данные по этому адресу или рядом с ним ОС или отладчик могут легко остановить или перехватить программу с этой ошибкой.
указатель void обычно является методом обмана или отключения проверки типа компилятора, например, если вы хотите вернуть указатель на один тип или неизвестный тип для использования в качестве другого типа. Например, malloc () возвращает указатель void на фрагмент памяти без типа, тип которого вы можете использовать в качестве указателя на байты, короткие ints, двойные поплавки, типпотато, или что там еще.
NULL- Это значение, допустимое для любого типа указателя. Он представляет собой отсутствие значения.указатель void-это тип. Любой тип указателя преобразуется в указатель void, поэтому он может указывать на любое значение. Это делает его хорошим для общего хранения, но плохо для использования. Сам по себе он не может быть использован для доступа к значению. Программа должна иметь дополнительный контекст, чтобы понять тип значения, на которое ссылается указатель void, прежде чем он сможет получить доступ к значению.
указатели Null и указатели void полностью отличаются друг от друга. Если мы запрашиваем операционную систему (через malloc () в C langauge) выделить память для определенного типа данных, то операционная система выделяет память в куче (если пространство доступно в куче) и отправляет адрес памяти, которая была выделена.
когда память выделяется ОС в куче, мы можем назначить это значение адреса в любой переменной типа указателя этого типа данных. Этот указатель является затем вызывается указатель void, пока он не будет принят для любого процесса.
когда пространство недоступно в куче, операционная система, безусловно, выделяет память и отправляет значение адреса этого местоположения,но эта память не выделяется в куче ОС, потому что в куче нет места, в этом случае эта память выделяется ОС в системной памяти.. Эта память не может быть доступна пользователю, следовательно, когда мы назначаем это значение адреса в указателе, то этот указатель известный как нулевой указатель, и мы не можем использовать этот указатель. В случае пустой указатель можно использовать для любого процесса на любом языке программирования.
не думаю ответ муравья является правильным.
NULLЭто просто константа указателя, иначе как бы мы моглиptr = NULL.- как
NULLэто указатель, каков его тип. Я думаю, что тип просто(void *), иначе как бы мы обаint * ptr = NULLи(user-defined type)* ptr = NULL.voidтип на самом деле универсального типа.- цитируется в "C11 (ISO/IEC 9899:201x) §6.3.2.3 указатели раздел 3":
целочисленная константа выражение со значением 0, или такое выражение приводится к типу Void *, называется нулевой указатель константа
Итак, проще говоря:
NULLуказатель-это константа указателя void.
нулевой указатель - это указатель, который ни на что не указывает, он используется в тех случаях, когда указателю не назначен действительный адрес в памяти. Каждый тип указателя, т. е. int *, char *, имеет собственное значение нулевого указателя.
A пустой указатель это тот, который не имеет никакого типа данных, связанных с ним, т. е. ему может быть присвоено значение любого типа. Также известный как указатель общего назначения, это соглашение C для raw адрес.
таким образом, нулевой указатель-это в основном нулевое значение, назначенное указателю любого типа данных, тогда как указатель void-это тип данных, который остается пустым до тех пор, пока ему не назначен адрес типа данных.
Comments