Форум программистов, компьютерный форум CyberForum.ru

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

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

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

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

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

Но, вообщем-то, главный вопрос: что использовать?
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...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Avazart
Эксперт С++
7148 / 5325 / 276
Регистрация: 10.12.2010
Сообщений: 23,559
Записей в блоге: 17
19.08.2012, 17:09 #16
C++
1
const short NULL = 0;
[BCC32 Error] Unit1.cpp(19): E2040 Declaration terminated incorrectly
Nameless One
Эксперт С++
5771 / 3420 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
19.08.2012, 17:09 #17
Цитата Сообщение от Avazart Посмотреть сообщение
И что получишь при подстановке макроса?
да, тогда уж

C++
1
2
3
#ifdef NULL
#undef NULL
const short NULL = 0;
Но смысла в этом нет
Anuta21
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
Nameless One
Эксперт С++
5771 / 3420 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
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"
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
19.08.2012, 17:34 #20
Уже ж сказано, что на NULL и 0 жалуются не по той причине, что NULL можно заменить или что-то ещё, а из-за автоприведения типов в Си++, которое иногда (неочевидным образом) может приводить ваш 0 или NULL (который заменяется на 0) к целому числу и вызывать косяки (тривиальный пример вон в третьем посте).

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

Считайте это — отсутствие токена «невалидный указатель», который обозначает только это, — первородным грехом дизайна языка.
Anuta21
0 / 0 / 0
Регистрация: 22.01.2012
Сообщений: 15
19.08.2012, 17:36 #21
Не знаю, почему у меня компиль предупреждает, главное чтобы компилировал
В общем 0 - самое надежное, а макросы опасны, особенно если их использует не разработчик, а злоумышленник, который хочет у разработчика что то испортить
как в башорге было с define и true c false
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
19.08.2012, 17:37 #22
Цитата Сообщение от Anuta21 Посмотреть сообщение
я к тому что, что надежнее не писать NULL, а использовать 0
Надежнее явно преобразовывать к указателю, если вы его неявно подразумеваете. А что вы будете кастовать - NULL или 0 - дело ваше.
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
20.08.2012, 12:41 #23
Вполне безопасно пользоваться 0, как и пишут Дейтелы:
Указатель со значением 0 или NULL ни на что не указывает и называется
нулевым указателем. Символическая константа NULL определяется в
заголовочном файле <iostream> (и некоторых других заголовочных файлах
стандартной библиотеки) и представляет значение 0. Инициализация указателя
константой NULL эквивалентна инициализации значением 0, но в C++
принято инициализировать указатели нулем. Когда присваивается значение 0, оно
преобразуется в указатель соответствующего типа. Нуль — единственное
целое значение, которое можно непосредственно присвоить
переменной-указателю, не приводя предварительно целое к типу указателя.
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
20.08.2012, 12:51 #24
Цитата Сообщение от Toshkarik Посмотреть сообщение
Вполне безопасно пользоваться 0, как и пишут Дейтелы:
Какое издание?
Цитата Сообщение от Toshkarik Посмотреть сообщение
Когда присваивается значение 0, оно преобразуется в указатель соответствующего типа.
Когда присваивается указателю - да. Когда речь заходит о шаблонах и перегрузках - нет.
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
20.08.2012, 12:57 #25
Полное 5-е издание.
Цитата Сообщение от soon Посмотреть сообщение
Когда речь заходит о шаблонах и перегрузках - нет.
Пример можно?
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
20.08.2012, 13:00 #26
Toshkarik, Пост #3
Nameless One
Эксперт С++
5771 / 3420 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
20.08.2012, 13:00 #27
Toshkarik, Что использовать с указателями? 0, NULL, nullptr?
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
20.08.2012, 13:12 #28
В данном случае, при написании foo( 0 ), компилятор, само собой, выбирает ссылку на константный объект, потому что 0 в первую очередь константа. И тут не вижу ничего не правильного, или опровергающего слова Дейтелов.
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
20.08.2012, 13:16 #29
Toshkarik, Я где-то опровергал Дейтелов?
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
20.08.2012, 13:18 #30
Ну, мне так показалось в сообщении #24. Если неправильно понял - извиняйте
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.08.2012, 13:18
Привет! Вот еще темы с ответами:

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++
Поддерживается ли? Как подключить?


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
20.08.2012, 13:18
Ответ Создать тему
Опции темы

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