Подтвердить что ты не робот

Какая разница между нулевым указателем и указателем void?

В чем разница между указателем Null и указателем Void?

4b9b3361

Ответ 1

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

Указатель Void - это определенный указатель type - void * - указатель, указывающий на какое-то местоположение данных в хранилище, которое не имеет определенного типа.

Итак, опять-таки нулевой указатель является значением, а указатель void - . Эти концепции совершенно разные и несопоставимы. Это по существу означает, что ваш вопрос, как указано, не совсем верен. Это похоже на запрос, например: "В чем разница между треугольником и автомобилем?".

Ответ 2

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

void *pointer = NULL;

Указатель NULL void.

Ответ 3

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

int* p = 0;

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

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

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

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

Ответ 4

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

Null ссылается на значение. Это по существу указатель на ничего и недопустимо использовать.

Ответ 5

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

Ответ 6

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

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

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

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

Ответ 7

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

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

Ответ 8

Нулевые указатели и указатели void полностью отличаются друг от друга. Если мы запрашиваем операционную систему (через malloc() в c langauge) для выделения памяти для определенного типа данных, то операционная система выделяет память в кучу (если пространство доступно в куче) и отправляет адрес выделенной памяти.

Когда память выделяется os в куче, мы можем присвоить это значение адреса любой переменной типа указателя этого типа данных. Этот указатель затем называется указателем void, пока он не будет принят для какого-либо процесса.

Когда пространство недоступно в куче, операционная система, конечно, выделяет память и отправляет значение адреса этого местоположения, но эта память не выделяется в куче os, потому что в куче нет места, в этом случае эта память выделяется os в системной памяти. Эта память не может быть доступна пользователю, поэтому, когда мы назначаем это значение адреса в указателе, этот указатель известен как нулевой указатель, и мы не можем использовать этот указатель. В случае указателя void мы можем использовать его для любого процесса на любом языке программирования.

Ответ 9

Я не думаю, что AnT answer является правильным.

  • 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 указатель является константой указателя пустоты.

Ответ 10

Указатель Null - это указатель, который не указывает ни на что, он используется в случаях, когда указателю не присвоен действительный адрес в памяти. Каждый тип указателя i.e int *, char * имеет нулевое значение указателя.

A указатель void - это тот, у которого нет связанного с ним типа данных, то есть ему может быть присвоено значение любого типа. Также известный как указатель общего назначения, это соглашение C для необработанного адреса.

Итак, нулевой указатель - это в основном нулевое значение, назначенное указателю любого типа данных, тогда как указатель void является типом данных, который остается недействительным, если ему не назначен адрес типа данных.

Ответ 11

Пустой указатель имеет значение 0. Пустой указатель - это общий указатель, введенный ANSI. Универсальный указатель может содержать адрес любого типа данных.

Ответ 12

Указатели void и null указывают на область памяти в конце.

null указатель указывает на место (в сегменте памяти), которое обычно является 0-м адресом сегмента памяти. Это почти все о том, как базовая ОС обрабатывает эту "зарезервированную" область памяти (деталь реализации), когда вы пытаетесь получить к ней доступ для чтения/записи или разыменования. Например, эта конкретная ячейка памяти может быть помечена как "недоступная" и выдает исключение при доступе к ней.

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

Как хорошо сказано выше, null указатель представляет значение, тогда как void* представляет тип больше, чем значение.