Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/263: Рейтинг темы: голосов - 263, средняя оценка - 4.77
3 / 3 / 0
Регистрация: 15.01.2012
Сообщений: 67

Что использовать с указателями? 0, NULL, nullptr?

16.08.2012, 21:50. Показов 50522. Ответов 34
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
NULL в WinDef.h описан как #define NULL 0. То есть в случае использования как с указателями, так и другими переменными разницы 0. Про nullptr только час назад узнал, даёт ли он какие-либо реальные преимущества?

Но, вообщем-то, главный вопрос: что использовать?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.08.2012, 21:50
Ответы с готовыми решениями:

Разница между NULL, nullptr и 0
Не очень давно занимаюсь программированием. Хотелось бы узнать в чём разница между NULL, nullptr и непосредственно нулём (0). Буду...

NULL с указателями
С понятием NULL столкнулся только что при изучении указателей. Поэтому еще не понимаю зачем он нужен и "с чем его едят". В...

Стоит ли использовать null ?
Впервые сталкиваюсь с null. Вещь вроде бы полезная, помогает избавиться от мусора, но её не рекомендуют использовать. Почему так...

34
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
16.08.2012, 22:10
Я чисто для наглядности в коде использую NULL для инициализации указателей (для переменных 0 ).

Поидее для указателей придумали nullptr ( но он не так бросается в глаза как NULL.)
2
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
16.08.2012, 22:20
Самое банальное
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <cstdlib>
 
void foo(const int&)
{
    std::cout << "foo(const int&)" << std::endl;
}
 
void foo(const int*)
{
    std::cout << "foo(const int*)" << std::endl;
}
 
int main()
{
    foo(NULL);
    foo(nullptr);
    return 0;
}
5
 Аватар для 4iFF
21 / 21 / 1
Регистрация: 06.07.2012
Сообщений: 88
16.08.2012, 23:14
Лучший ответ Сообщение было отмечено как решение

Решение

Rengen, для обнуление указателя лучше использовать nullptr, т.к.:
"Причина введения nullptr в язык С++ заключается в устранение возможных недоразумений между литералом 0 как целочисленным значением и указателем. Двойное значение литерала 0 может вызывать проблемы при некоторых обстоятельствах. Литерал nullptr имеет тип std::nullptr_t, и его нельзя перепутать со значением другого типа. Он может быть неявно преобразован в любой ссылочный тип, но ни в один целочисленный тип, кроме типа bool." - Айвор Хортон, Visual C++ 2010, Глава 4 *примечание.
7
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
16.08.2012, 23:17
К сожелению в Builder2009 nullptr покаместь только зарезевирован как слово, но не реализован.
0
 Аватар для Mиxaил
542 / 447 / 162
Регистрация: 10.12.2009
Сообщений: 1,857
16.08.2012, 23:42
nullptr рекомендуют использовать в C++11

Добавлено через 3 минуты
C++
1
2
3
namespace std {
typedef decltype(nullptr) nullptr_t;
}
0
54 / 48 / 4
Регистрация: 02.08.2012
Сообщений: 127
17.08.2012, 01:20
по идее, nullptr=NULL=0, но nullptr лучше передавать вместо 0/NULL в функцию если нужно указатель, а проверить указатель можно так:
C++
1
2
if (!pointer) {}
if (pointer!=nullptr){} // аналогично первому
0
3 / 3 / 0
Регистрация: 15.01.2012
Сообщений: 67
19.08.2012, 13:52  [ТС]
То есть, опять, что использовать решать мне. Всем спасибо.
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
19.08.2012, 15:42
Лучший ответ Сообщение было отмечено как решение

Решение

Для C++ более старых версий nullptr легко добавляется одной строчкой:
C++
1
static struct nullptr_t {template<typename T> operator T* () const {return 0;}} nullptr;
При переходе на новую версию компилятора её можно будет просто выкинуть из соответсвующего заголовочного файла.
9
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
19.08.2012, 15:45
Цитата Сообщение от cossack5 Посмотреть сообщение
nullptr=NULL=0
Только если типом NULL/0 является указатель или bool. В противном случае, утверждение неверно.

Цитата Сообщение от Rengen Посмотреть сообщение
То есть, опять, что использовать решать мне.
Если есть возможность использовать nullptr - используйте.

Добавлено через 2 минуты
Nick Alte, еще каст в bool добавить надо бы для полной совместимости.
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
19.08.2012, 15:58
Цитата Сообщение от soon Посмотреть сообщение
еще каст в bool добавить надо бы для полной совместимости.
Пока я такой конструкцией пользовался до перехода на VS 2010, мне такой каст ни разу не пригодился, но пуркуа бы, как говорится, и не па:
C++
1
2
3
4
static struct nullptr_t {
    template<typename T> operator T* () const {return 0;}
    operator bool () const {return false;}
} nullptr;
0
0 / 0 / 0
Регистрация: 22.01.2012
Сообщений: 15
19.08.2012, 16:52
Все проще, лучше использовать стандартный 0 или nullptr, потому что NULL - это макрос компилятора, и он может иметь значение, отличное от 0 - мало что взбредет в голову разработчику компилятора
или на крайний случай:
const short NULL = 0;
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.08.2012, 16:53
и он может иметь значение, отличное от 0 - мало что взбредет в голову разработчику компилятора
Нафига тогда пользоваться таким компилятором?
Тем более проверить не проблема.

C++
1
const short NULL = 0;
И что получишь при подстановке макроса?
0
0 / 0 / 0
Регистрация: 22.01.2012
Сообщений: 15
19.08.2012, 17:05
Страуструп описывал про макрос NULL:

5.1.1. Ноль.
...
В языке С было очень популярно определять макрос NULL для представления такого нулевого указателя. Так как в C++ типы проверяются более жестко, использование банального нуля вместо NULL приведет к меньшим проблемам. Если вы чувствуете, что просто обязаны определить NULL, воспользуйтесь
const int NULL = 0;
А так, использую обычный 0, и горя не знаю
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
19.08.2012, 17:07
Цитата Сообщение от Anuta21 Посмотреть сообщение
и он может иметь значение, отличное от 0
в C++ - не может
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.08.2012, 17:09
C++
1
const short NULL = 0;
[BCC32 Error] Unit1.cpp(19): E2040 Declaration terminated incorrectly
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
19.08.2012, 17:09
Цитата Сообщение от Avazart Посмотреть сообщение
И что получишь при подстановке макроса?
да, тогда уж

C++
1
2
3
#ifdef NULL
#undef NULL
const short NULL = 0;
Но смысла в этом нет
0
0 / 0 / 0
Регистрация: 22.01.2012
Сообщений: 15
19.08.2012, 17:11
я юзаю minGW Qt:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
#include <QtGui/QApplication>
#include <QDebug>
#define NULL 1;
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
 
    qDebug() << NULL;
 
    return a.exec();
}
выдает у меня 1

компилятор, конечно, предупредил, но позволил компилить

я к тому что, что надежнее не писать NULL, а использовать 0
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
19.08.2012, 17:28
Цитата Сообщение от Anuta21 Посмотреть сообщение
компилятор, конечно, предупредил, но позволил компилить
я к тому что, что надежнее не писать NULL, а использовать 0
Ну вот пара примеров из той же оперы

C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <cassert>
 
const int size = 5;
 
#define size 6
 
int main()
{
    assert(size == 5);
}
Константы ненадежны! Их значение можно изменить!

header.h:
C++
1
2
3
4
5
6
7
8
9
10
#ifndef HEADER_H
#define HEADER_H
 
class foo
{
private:
    int private_field;
};
 
#endif // HEADER_H
main.cc:
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
#define private public
#include "header.h"
 
int main()
{
    foo f;
    f.private_field = 5;
    std::cout << f.private_field << std::endl;
}
Получается, что классы ненадежны, инкапсуляция нарушается! Нельзя иx использовать!

Так что (в отсутствие nullptr) использовать NULL в качестве «константы» нулевого указателя не менее надежно, чем использовать константы или классы

Добавлено через 3 минуты
Кстати, в отличие от твоего примера ни один из моих не выдал предупреждение ошибку, хотя они компилировались с ключами "-Werror -ansi -pedantic-errors"
2
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
19.08.2012, 17:34
Уже ж сказано, что на NULL и 0 жалуются не по той причине, что NULL можно заменить или что-то ещё, а из-за автоприведения типов в Си++, которое иногда (неочевидным образом) может приводить ваш 0 или NULL (который заменяется на 0) к целому числу и вызывать косяки (тривиальный пример вон в третьем посте).

А эти очевидные грабли с #define NULL 42 — ну, это вы сами себе в ногу стреляете; разработчики языка не обязаны нянчиться с вами.

Считайте это — отсутствие токена «невалидный указатель», который обозначает только это, — первородным грехом дизайна языка.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.08.2012, 17:34
Помогаю со студенческими работами здесь

Оптимально ли использовать методы расширения для проверки на null?
Коллеги добрый день! Подскажите, совсем запамятовал.. Вот часто бывает необходимость проверить объект на null и если он равен null ...

Значение Null в datagridview вызывает исключение. Не получается использовать Try-Catch
Доброго времени суток. Чет уже котелок совсем не варит. после прохождения всех строк в DGV ...

Можно ли вместо предиката null использовать предикат (eql l nil)?
14. Часто, при выполнении каких-либо действий над хвостом списка мы используем предикат null проверки конца списка. Например: (defun...

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

Зачем в качестве параметра передавать null и потом использовать его как массив?
Я встретил такой код и он УБИЛ МЕНЯ НАПОВАЛ(: public static function getCellsWeight($kpW, $ss=null, $alf=null) { $res =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru