Что такое указатель void и что такое указатель null?

Итак, я проходил через некоторые вопросы интервью, и я наткнулся один о указателях void и null, который утверждает:

указатель без возвращаемого типа называется нулевым указателем. Это может быть любой тип данных.

Это меня смутило! Кажется, что void и null могут использоваться взаимозаменяемо в соответствии с этим вопросом, и я не считаю это правильным. Я предположил, что void является типом возврата, а null-значением. но я я просто новичок и не уверен, что я прав.

пожалуйста, выразите свое мнение о том, что такое нулевой указатель и указатель void. Я не ищу разницы между null и void.

9 ответов


эти два понятия ортогональности:

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

указатель void может быть нулевым или нет:

void *void_ptr1 = nullptr;
void *void_ptr2 = malloc(42);
void *void_ptr3 = new Foo;               // void * can point to almost anything
void *void_ptr4 = (char*)void_ptr3 + 1;  // even somewhere inside an object

указатель Non-void также может быть нулевым или нет:

Foo *f = nullptr;
Foo *g = new Foo;

просто забудьте об этом ответе. Цитата из вашей ссылки :

"указатель без возвращаемого типа вызывается нулевой указатель."

Это sooo plain неправильно. Указатель тип возвращаемого? Неужели? Это плохой источник...

void* универсальный указатель тип потому что любой тип указателя (за исключением указателя на const и/или летучих) может быть неявно преобразован в void*. Другими словами, вы можете назначить любой указатель переменной типа void*. Нулевой указатель-это указатель стоимостью 0


на void тип в общем означает, что информация о типе не указана.

вы всегда должны иметь в виду, что указатель передает два куска информации:тип указанных данных (int, double, ...), который указывает, как его интерпретировать, и адрес данных, на которые он указывает, что указывает здесь вы можете получить фактическое значение указанных данных.

информация типа В тип указателя (double*, int*, ...), в то время как адрес данных является фактическим значением, содержащимся в переменной указателя.

Итак, a void указатель (void *) - указатель, который не указывает никакой информации о типе. Он говорит вам, где находятся данные, но не говорит вам, как их интерпретировать. Вы знаете, что по этому адресу что-то есть, но вы не знаете, является ли это int, a double или множество летающих коров. К фактически используйте такие данные, вы должны получить информацию о типе каким-то другим способом (например, с каким-то другим магическим параметром), привести этот указатель к обычному типу указателя, а затем использовать его как обычно.

void * часто используется в C для обеспечения некоторой поддержки общего программирования; см., например,qsort функции библиотеки C.

A NULL указатель, вместо этого, является указателем, который указывает ни на что. В этом случае сведения о типе указатель вообще присутствует, но отсутствует адрес указанных данных. Конечно, можно было!--9--> что это NULL.

быстрый пример (предположим, что v объявлен double v;):

                         Type information present
             +----------------------+----------------------+
             |          ✔           |          ✘           |
         +---+----------------------+----------------------+
    p  c |   |                      |                      |
 v  o  o | ✔ | double * ptr = &v;   | void * ptr = &v;     |
 a  i  n |   |                      |                      |
 l  n  t +---+----------------------+----------------------+
 i  t  e |   |                      |                      |
 d  e  n | ✘ | double * ptr = NULL; | void * ptr = NULL;   |
    d  t |   |                      |                      |
         +---+----------------------+----------------------+

Тривиа: NULL, по крайней мере в текущем стандарте, гарантированно будет 0.

в других областях языка, void всегда используется для указания типа хватает. Используя его как вернуть значение (примечание: Я говорю сейчас о void, а не void *) означает, что функция не возвращает никакого значения, а приведение выражения в void-это причудливый способ отбросить значение (вы сигнализируете компилятору и другим программистам, что вы осознаете, что не используете определенное значение).


Пожалуйста, скажите нам: в чем разница:

  • между газовым баллоном и безгазовой ситуацией
  • между cookie jar и No-cookies
  • между термином 'деньги' и 'пустые карманы'

Если вы придумаете это, вы сможете понять null vs void* dillema.


void - это не тип. null - это не ценность.


вот некоторые различия в отношении арифметики указателя:

Это связано с тем, что Void неполный тип.

void *vp;
vp++;     // error, incomplete type
vp += 2;  // same error

void *p = 0;
p++;      // still same error

int *p = 0;
p++;      // well-formed program, but UB (.6/5)

связанная статья просто неправильно. Его первое предложение:

указатель без возвращаемого типа вызывается нулевой указатель

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

вы почти правы. "Указатель на void" - это тип (а не "тип возврата"). Значения любого типа могут быть возвращены функциями и, таким образом, быть (возвращаемым типом функции).

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

указатель на void также может быть null;

void *nothing = 0;

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


нулевой указатель указывает на 0x000000 (что неверно для доступа к указателю), в то время как указатель void является правильным указателем на неопределенный тип(void *). Однако, пустой указатель может быть нулевым указателем, но потом unreferencing указатель будет сгенерирована ошибка.


A void *ptr - указатель, который можно использовать для указания любого типа данных. Может быть!--1-->, float, double. Он не имеет возвращаемого типа, который изначально указатель создается с типом указателя (имеющим шестнадцатеричное значение), и мы можем назначить этот указатель любому типу данных.

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