В чем разница между нулевым указателем и пустым указателем? - PullRequest
58 голосов
/ 27 августа 2010

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

Ответы [ 11 ]

110 голосов
/ 27 августа 2010

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

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

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

11 голосов
/ 27 августа 2010

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

void *pointer = NULL;

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

4 голосов
/ 27 августа 2010

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

int* p = 0;

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

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

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

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

3 голосов
/ 27 августа 2010

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

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

2 голосов
/ 27 августа 2010

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

1 голос
/ 10 сентября 2012

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

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

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

1 голос
/ 27 августа 2010

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

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

1 голос
/ 27 августа 2010

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

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

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

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

0 голосов
/ 06 июля 2019

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

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

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

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

0 голосов
/ 20 июня 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...