В чем разница между нулевым и пустым указателями?

В чем разница между пустым указателем и Пустой указатель ?

59
задан Jesse Dhillon 27 August 2010 в 05:45
поделиться

7 ответов

Нулевой указатель — это специальное зарезервированное значение указателя. Указатель любого типа имеет такое зарезервированное значение. Формально каждый конкретный тип указателя (int *, char * и т. д.) имеет собственное выделенное значение нулевого указателя. Концептуально, когда указатель имеет это нулевое значение, он никуда не указывает.

Void pointer — это конкретный указатель typevoid * — указатель, указывающий на некоторое место данных в хранилище, которое не имеет определенного типа.

Итак, еще раз, нулевой указатель является значением, а пустой указатель является типом. Эти понятия совершенно разные и несопоставимые. По сути, это означает, что ваш вопрос, как указано, не совсем корректен. Это все равно, что спросить, например: «Чем отличается треугольник от автомобиля?».

112
ответ дан 24 November 2019 в 18:13
поделиться

NULL — это значение, допустимое для любого типа указателя. Он представляет собой отсутствие значения.

Указатель void — это тип. Любой тип указателя можно преобразовать в пустой указатель, поэтому он может указывать на любое значение. Это делает его хорошим для общего хранения, но плохим для использования. Сам по себе он не может использоваться для доступа к значению. Программа должна иметь дополнительный контекст, чтобы понять тип значения, на которое ссылается указатель void, прежде чем она сможет получить доступ к значению.

1
ответ дан 24 November 2019 в 18:13
поделиться

Точки нулевого указателя имеют значение NULL, которое обычно равно 0 , но в любом случае место в памяти, которое недопустимо для разыменования. Указатель void указывает на данные типа void. Слово «недействительно» не является признаком того, что данные, на которые ссылается указатель, недействительны или что указатель был аннулирован.

2
ответ дан 24 November 2019 в 18:13
поделиться

Void относится к типу. В основном тип данных, на который он указывает, неизвестен.

Null относится к значению. По сути, это указатель ни на что, и его нельзя использовать.

3
ответ дан 24 November 2019 в 18:13
поделиться

Это два разных понятия: "пустой указатель" - это тип (void *). «нулевой указатель» — это указатель, который имеет нулевое значение (NULL). Пример:

void *pointer = NULL;

Это пустой указатель NULL.

11
ответ дан 24 November 2019 в 18:13
поделиться

Нулевой указатель гарантированно не будет эквивалентен указателю на любой объект. Его фактическое значение зависит от системы и может варьироваться в зависимости от типа. Чтобы получить нулевой указатель int, вы должны сделать

int* p = 0;

Нулевой указатель будет возвращен malloc в случае ошибки.

Мы можем проверить, является ли указатель нулевым, т. е. если malloc или какая-либо другая функция не удалась, просто проверив ее логическое значение:

if (p) {
    /* Pointer is not null */
} else {
    /* Pointer is null */
}

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

4
ответ дан 24 November 2019 в 18:13
поделиться

Обычно нулевой указатель (который может быть любого типа, включая пустой указатель!) указывает на:

  • адрес 0, с которым большинство наборов инструкций ЦП могут выполнять очень быстрое сравнение и переход (например, для проверки неинициализированных или недействительных указателей) с оптимальным размером кода/производительностью для ISA.

  • адрес, к которому код пользователя не может получить доступ (например, 0x00000000 во многих случаях), поэтому, если код действительно пытается получить доступ к данным по этому адресу или рядом с ним, ОС или отладчик могут легко остановить или перехватить программу с этим адресом. ошибка.

Указатель void обычно является методом обмана или отключения проверки типов компилятором, например, если вы хотите вернуть указатель на один тип или неизвестный тип для использования в качестве другого типа. Например, malloc() возвращает пустой указатель на бестиповый фрагмент памяти, тип которого вы можете привести для последующего использования в качестве указателя на байты, короткие целые числа, двойные числа с плавающей запятой, typePotato или что-то еще.

1
ответ дан 24 November 2019 в 18:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: