Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 86, средняя оценка - 4.76
Rengen
3 / 3 / 0
Регистрация: 15.01.2012
Сообщений: 67
#1

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

16.08.2012, 21:50. Просмотров 14977. Ответов 29
Метки нет (Все метки)

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

Но, вообщем-то, главный вопрос: что использовать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.08.2012, 21:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Что использовать с указателями? 0, NULL, nullptr? (C++):

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

Что не так с этими указателями? - C++
Всем привет, прошу помощи разобраться в коде. Недавно начал изучать C++ по книге Лафоре. В главе с указателями есть пример со связными...

Не могу что-то понять с указателями - C++
Объясните мне,пожалуйста, почему когда я пишу так: void main() { char arr="erbb45"; char *parr = &arr; cout << hex; ...

переделать код, что б было с указателями - C++
помогите пожалуйста, нужно не использовать а все сделать через указатели #include "stdafx.h" #include "math.h" #include "time.h" ...

Что не так при работе с указателями? - C++
Здравствуйте! Начинаю изучать работу с указателями. #include <iostream> using namespace std; int fun(int a, int b, long...

Работа с указателями: подскажите что я не так делаю - C++
Добрый день Подскажите пожалуйста что в этой программе не так #include <iostream> using namespace std; void...

29
Avazart
Эксперт С++
7458 / 5504 / 315
Регистрация: 10.12.2010
Сообщений: 24,556
Записей в блоге: 17
16.08.2012, 22:10 #2
Я чисто для наглядности в коде использую NULL для инициализации указателей (для переменных 0 ).

Поидее для указателей придумали nullptr ( но он не так бросается в глаза как NULL.)
1
soon
2542 / 1307 / 81
Регистрация: 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;
}
4
4iFF
19 / 19 / 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 *примечание.
5
Avazart
Эксперт С++
7458 / 5504 / 315
Регистрация: 10.12.2010
Сообщений: 24,556
Записей в блоге: 17
16.08.2012, 23:17 #5
К сожелению в Builder2009 nullptr покаместь только зарезевирован как слово, но не реализован.
0
Mиxaил
533 / 438 / 37
Регистрация: 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
cossack5
54 / 48 / 1
Регистрация: 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
Rengen
3 / 3 / 0
Регистрация: 15.01.2012
Сообщений: 67
19.08.2012, 13:52  [ТС] #8
То есть, опять, что использовать решать мне. Всем спасибо.
0
Nick Alte
Эксперт С++
1644 / 1016 / 120
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
19.08.2012, 15:42 #9
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Для C++ более старых версий nullptr легко добавляется одной строчкой:
C++
1
static struct nullptr_t {template<typename T> operator T* () const {return 0;}} nullptr;
При переходе на новую версию компилятора её можно будет просто выкинуть из соответсвующего заголовочного файла.
7
soon
2542 / 1307 / 81
Регистрация: 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
Nick Alte
Эксперт С++
1644 / 1016 / 120
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
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
Anuta21
0 / 0 / 0
Регистрация: 22.01.2012
Сообщений: 15
19.08.2012, 16:52 #12
Все проще, лучше использовать стандартный 0 или nullptr, потому что NULL - это макрос компилятора, и он может иметь значение, отличное от 0 - мало что взбредет в голову разработчику компилятора
или на крайний случай:
const short NULL = 0;
0
Avazart
Эксперт С++
7458 / 5504 / 315
Регистрация: 10.12.2010
Сообщений: 24,556
Записей в блоге: 17
19.08.2012, 16:53 #13
и он может иметь значение, отличное от 0 - мало что взбредет в голову разработчику компилятора
Нафига тогда пользоваться таким компилятором?
Тем более проверить не проблема.

C++
1
const short NULL = 0;
И что получишь при подстановке макроса?
0
Anuta21
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
Nameless One
Эксперт С++
5780 / 3429 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
19.08.2012, 17:07 #15
Цитата Сообщение от Anuta21 Посмотреть сообщение
и он может иметь значение, отличное от 0
в C++ - не может
0
19.08.2012, 17:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.08.2012, 17:07
Привет! Вот еще темы с ответами:

Union с явными указателями или void*- что выбрать? - C++
В программе предполагается использование огромного количества указателей типа void*, по которым будут хранится объекты типов А и Х. Т.о....

Не могу понять, что означает данная операция с указателями - C++
вот такой код #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int rrr2 (int **p) {return ((**p-1)***p);}; ...

G++ не распознает nullptr - C++
Компилятор gcc4.5 флаг -std=gnu++0x но не распознает nullptr почему то Build Prog_name -fmessage-length=0 -std=gnu++0x -fPIC...

nullptr в codeblocks - C++
Поддерживается ли? Как подключить?


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.