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

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

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

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

Но, вообщем-то, главный вопрос: что использовать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.08.2012, 21:50
Ответы с готовыми решениями:

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

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

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

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

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

Поидее для указателей придумали nullptr ( но он не так бросается в глаза как NULL.)
2
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
16.08.2012, 22:20 3
Самое банальное
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
21 / 21 / 1
Регистрация: 06.07.2012
Сообщений: 88
16.08.2012, 23:14 4
Лучший ответ Сообщение было отмечено как решение

Решение

Rengen, для обнуление указателя лучше использовать nullptr, т.к.:
"Причина введения nullptr в язык С++ заключается в устранение возможных недоразумений между литералом 0 как целочисленным значением и указателем. Двойное значение литерала 0 может вызывать проблемы при некоторых обстоятельствах. Литерал nullptr имеет тип std::nullptr_t, и его нельзя перепутать со значением другого типа. Он может быть неявно преобразован в любой ссылочный тип, но ни в один целочисленный тип, кроме типа bool." - Айвор Хортон, Visual C++ 2010, Глава 4 *примечание.
7
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
16.08.2012, 23:17 5
К сожелению в Builder2009 nullptr покаместь только зарезевирован как слово, но не реализован.
0
542 / 447 / 162
Регистрация: 10.12.2009
Сообщений: 1,857
16.08.2012, 23:42 6
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 7
по идее, 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  [ТС] 8
То есть, опять, что использовать решать мне. Всем спасибо.
0
Эксперт С++
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
19.08.2012, 15:42 9
Лучший ответ Сообщение было отмечено как решение

Решение

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

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

Добавлено через 2 минуты
Nick Alte, еще каст в bool добавить надо бы для полной совместимости.
0
Эксперт С++
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
19.08.2012, 15:58 11
Цитата Сообщение от 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 12
Все проще, лучше использовать стандартный 0 или nullptr, потому что NULL - это макрос компилятора, и он может иметь значение, отличное от 0 - мало что взбредет в голову разработчику компилятора
или на крайний случай:
const short NULL = 0;
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.08.2012, 16:53 13
и он может иметь значение, отличное от 0 - мало что взбредет в голову разработчику компилятора
Нафига тогда пользоваться таким компилятором?
Тем более проверить не проблема.

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

5.1.1. Ноль.
...
В языке С было очень популярно определять макрос NULL для представления такого нулевого указателя. Так как в C++ типы проверяются более жестко, использование банального нуля вместо NULL приведет к меньшим проблемам. Если вы чувствуете, что просто обязаны определить NULL, воспользуйтесь
const int NULL = 0;
А так, использую обычный 0, и горя не знаю
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
19.08.2012, 17:07 15
Цитата Сообщение от Anuta21 Посмотреть сообщение
и он может иметь значение, отличное от 0
в C++ - не может
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.08.2012, 17:09 16
C++
1
const short NULL = 0;
[BCC32 Error] Unit1.cpp(19): E2040 Declaration terminated incorrectly
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
19.08.2012, 17:09 17
Цитата Сообщение от 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 18
я юзаю 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
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
19.08.2012, 17:28 19
Цитата Сообщение от 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
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
19.08.2012, 17:34 20
Уже ж сказано, что на NULL и 0 жалуются не по той причине, что NULL можно заменить или что-то ещё, а из-за автоприведения типов в Си++, которое иногда (неочевидным образом) может приводить ваш 0 или NULL (который заменяется на 0) к целому числу и вызывать косяки (тривиальный пример вон в третьем посте).

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

Считайте это — отсутствие токена «невалидный указатель», который обозначает только это, — первородным грехом дизайна языка.
1
19.08.2012, 17:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.08.2012, 17:34
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru