В чем разница между пустым указателем и Пустой указатель ?
Нулевой указатель — это специальное зарезервированное значение указателя. Указатель любого типа имеет такое зарезервированное значение. Формально каждый конкретный тип указателя (int *
, char *
и т. д.) имеет собственное выделенное значение нулевого указателя. Концептуально, когда указатель имеет это нулевое значение, он никуда не указывает.
Void pointer — это конкретный указатель type — void *
— указатель, указывающий на некоторое место данных в хранилище, которое не имеет определенного типа.
Итак, еще раз, нулевой указатель является значением, а пустой указатель является типом. Эти понятия совершенно разные и несопоставимые. По сути, это означает, что ваш вопрос, как указано, не совсем корректен. Это все равно, что спросить, например: «Чем отличается треугольник от автомобиля?».
NULL
— это значение, допустимое для любого типа указателя. Он представляет собой отсутствие значения.
Указатель void — это тип. Любой тип указателя можно преобразовать в пустой указатель, поэтому он может указывать на любое значение. Это делает его хорошим для общего хранения, но плохим для использования. Сам по себе он не может использоваться для доступа к значению. Программа должна иметь дополнительный контекст, чтобы понять тип значения, на которое ссылается указатель void, прежде чем она сможет получить доступ к значению.
Точки нулевого указателя имеют значение NULL
, которое обычно равно 0 , но в любом случае место в памяти, которое недопустимо для разыменования. Указатель void указывает на данные типа void. Слово «недействительно» не является признаком того, что данные, на которые ссылается указатель, недействительны или что указатель был аннулирован.
Void относится к типу. В основном тип данных, на который он указывает, неизвестен.
Null относится к значению. По сути, это указатель ни на что, и его нельзя использовать.
Это два разных понятия: "пустой указатель" - это тип (void *). «нулевой указатель» — это указатель, который имеет нулевое значение (NULL). Пример:
void *pointer = NULL;
Это пустой указатель NULL.
Нулевой указатель гарантированно не будет эквивалентен указателю на любой объект. Его фактическое значение зависит от системы и может варьироваться в зависимости от типа. Чтобы получить нулевой указатель int
, вы должны сделать
int* p = 0;
Нулевой указатель будет возвращен malloc
в случае ошибки.
Мы можем проверить, является ли указатель нулевым, т. е. если malloc
или какая-либо другая функция не удалась, просто проверив ее логическое значение:
if (p) {
/* Pointer is not null */
} else {
/* Pointer is null */
}
Пустой указатель может указывать на любой тип, и это зависит от вас. для обработки того, сколько памяти потребляют объекты, на которые ссылаются, для разыменования и арифметики указателя.
Обычно нулевой указатель (который может быть любого типа, включая пустой указатель!) указывает на:
адрес 0, с которым большинство наборов инструкций ЦП могут выполнять очень быстрое сравнение и переход (например, для проверки неинициализированных или недействительных указателей) с оптимальным размером кода/производительностью для ISA.
адрес, к которому код пользователя не может получить доступ (например, 0x00000000 во многих случаях), поэтому, если код действительно пытается получить доступ к данным по этому адресу или рядом с ним, ОС или отладчик могут легко остановить или перехватить программу с этим адресом. ошибка.
Указатель void обычно является методом обмана или отключения проверки типов компилятором, например, если вы хотите вернуть указатель на один тип или неизвестный тип для использования в качестве другого типа. Например, malloc() возвращает пустой указатель на бестиповый фрагмент памяти, тип которого вы можете привести для последующего использования в качестве указателя на байты, короткие целые числа, двойные числа с плавающей запятой, typePotato или что-то еще.