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

Что такое указатель void и что такое пустой указатель?

Итак, я обсуждал некоторые вопросы интервью, и я встретил этот вопрос

Ответ на вопрос меня смутил! Кажется недействительным, и null может использоваться взаимозаменяемо в соответствии с этим вопросом, и я не верю, что это правильно. Я предполагал, что void является типом возврата, а null - значением. Но я всего лишь кодекс-новобранец, и я не уверен, что знаю правильно. Следовательно, всем гуру там. Если бы вы могли пролить свет, это было бы очень полезно!:)

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

4b9b3361

Ответ 1

Два понятия ортогональны:

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

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

void *void_ptr1 = NULL;
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

Непустой указатель также может быть нулевым или нет:

Foo *f = NULL;
Foo *g = new Foo;

Ответ 2

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

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

Это sooo plain WRONG. Указатель возвращаемый тип? ДЕЙСТВИТЕЛЬНО? Это плохой источник...

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

Ответ 3

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

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

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

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

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

A NULL Указатель, вместо этого, является указателем, который указывает на ничего. В этом случае присутствует информация о типе указателя в целом, но это адрес отсутствующих указательных данных. Конечно, возможно иметь void *, что 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 |   |                      |                      |
         +---+----------------------+----------------------+

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

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

Ответ 4

void не является типом. null - это не значение.

Ответ 5

Скажите, пожалуйста, какая разница:

  • между газовым резервуаром и ситуацией без газа.
  • между файлом cookie и no-cookies
  • между терминами "деньги" и "пустые карманы"

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

Ответ 6

Здесь некоторые отличия относительно арифметики указателя:

Это связано с тем, что 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 ($5.6/5)

Ответ 7

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

Ответ 8

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

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

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

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

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

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

void *nothing = 0;

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

Ответ 9

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

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