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

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

16.08.2012, 21:50. Показов 50920. Ответов 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
0 / 0 / 0
Регистрация: 22.01.2012
Сообщений: 15
19.08.2012, 17:36
Студворк — интернет-сервис помощи студентам
Не знаю, почему у меня компиль предупреждает, главное чтобы компилировал
В общем 0 - самое надежное, а макросы опасны, особенно если их использует не разработчик, а злоумышленник, который хочет у разработчика что то испортить
как в башорге было с define и true c false
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
19.08.2012, 17:37
Цитата Сообщение от Anuta21 Посмотреть сообщение
я к тому что, что надежнее не писать NULL, а использовать 0
Надежнее явно преобразовывать к указателю, если вы его неявно подразумеваете. А что вы будете кастовать - NULL или 0 - дело ваше.
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
20.08.2012, 12:41
Вполне безопасно пользоваться 0, как и пишут Дейтелы:
Указатель со значением 0 или NULL ни на что не указывает и называется
нулевым указателем. Символическая константа NULL определяется в
заголовочном файле <iostream> (и некоторых других заголовочных файлах
стандартной библиотеки) и представляет значение 0. Инициализация указателя
константой NULL эквивалентна инициализации значением 0, но в C++
принято инициализировать указатели нулем. Когда присваивается значение 0, оно
преобразуется в указатель соответствующего типа. Нуль — единственное
целое значение, которое можно непосредственно присвоить
переменной-указателю, не приводя предварительно целое к типу указателя.
2
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
20.08.2012, 12:51
Цитата Сообщение от Toshkarik Посмотреть сообщение
Вполне безопасно пользоваться 0, как и пишут Дейтелы:
Какое издание?
Цитата Сообщение от Toshkarik Посмотреть сообщение
Когда присваивается значение 0, оно преобразуется в указатель соответствующего типа.
Когда присваивается указателю - да. Когда речь заходит о шаблонах и перегрузках - нет.
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
20.08.2012, 12:57
Полное 5-е издание.
Цитата Сообщение от soon Посмотреть сообщение
Когда речь заходит о шаблонах и перегрузках - нет.
Пример можно?
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
20.08.2012, 13:00
Toshkarik, Пост #3
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
20.08.2012, 13:00
Toshkarik, Что использовать с указателями? 0, NULL, nullptr?
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
20.08.2012, 13:12
В данном случае, при написании foo( 0 ), компилятор, само собой, выбирает ссылку на константный объект, потому что 0 в первую очередь константа. И тут не вижу ничего не правильного, или опровергающего слова Дейтелов.
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
20.08.2012, 13:16
Toshkarik, Я где-то опровергал Дейтелов?
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
20.08.2012, 13:18
Ну, мне так показалось в сообщении #24. Если неправильно понял - извиняйте
0
9 / 7 / 3
Регистрация: 03.02.2017
Сообщений: 124
24.06.2019, 20:34
Цитата Сообщение от cossack5 Посмотреть сообщение
по идее, nullptr=NULL=0, но nullptr лучше передавать вместо 0/NULL в функцию если нужно указатель, а проверить указатель можно так:
C++
1
2
if (!pointer) {}
if (pointer!=nullptr){} // аналогично первому
А вот и не правда!
C++
1
2
if (pointer) {} // нет !-знака
if (pointer!=nullptr){} // аналогично первому
вот так правда
1
 Аватар для leo7755
3 / 3 / 1
Регистрация: 12.02.2017
Сообщений: 81
21.08.2021, 21:56
Есть функция, которая ищет первое попавшееся слово из списка forb_words (std::vector<std::string> forb_words) и передаёт его в случае успеха в amx_SetString. Правильно ли я расположил все nullptr в этой функции? И в каких местах не правильно использовал?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// native IsFindForbWord(const source[], word[]);
cell AMX_NATIVE_CALL Natives::IsFindForbWord(AMX *amx, cell *params)
{
    // при объявлении указателей обнуляем nullptr'ом
    char *source = nullptr;
    amx_StrParam(amx, params[1], source);
 
 
    char *piece = nullptr;
    piece = strtok(source, DELIMITERS);
 
    // в условии while используем также nullptr
    while (piece != nullptr)
    {
        for (const auto &element : forb_words)
        {
            if (strcmp(piece, element.c_str()) == 0)
            {
                // объявлен как typedef int32_t   cell; - тут тоже вопрос, можно ли nullptr?
                cell *str_addr = nullptr;
                amx_GetAddr(amx, params[2], &str_addr);
                amx_SetString(str_addr, element.c_str(), 0, 0, element.size() + 1);
 
                return 1;
            }
        }
 
        // оставить как NULL, или прописать 0, или всё-таки nullptr?
        piece = strtok(NULL, DELIMITERS);
    }
 
    cell *str_addr = nullptr;
    amx_GetAddr(amx, params[2], &str_addr);
    amx_SetString(str_addr, "", 0, 0, 1);
 
    return 0;
}
0
фрилансер
 Аватар для Алексей1153
6495 / 5723 / 1133
Регистрация: 11.10.2019
Сообщений: 15,284
22.08.2021, 08:16
leo7755, всё правильно, кроме NULL

Цитата Сообщение от leo7755 Посмотреть сообщение
NULL
в C++11 и старше вообще не используй NULL. Используй nullptr

и я бы возвращаемые значения на всякий случай так оформил бы
return cell{1};
return cell{0};

или даже сделал бы константы constexpr

ещё смущает то, что размеры "массива" params не указаны, а в коде смело используются индексы 1 и 2 (то есть, размер должен быть как минимум == 3)

Кликните здесь для просмотра всего текста
А вот код вообще без упоминания nullptr (типа выпендрёж )
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
cell AMX_NATIVE_CALL Natives::IsFindForbWord(AMX* amx, cell* params)
{
    char* source{};
    amx_StrParam(amx, params[1], source);
 
    char* piece = strtok(source, DELIMITERS);
 
    while (piece)
    {
        for (const auto &element : forb_words)
        {
            if (strcmp(piece, element.c_str()) == 0)
            {
                cell* str_addr{};
                amx_GetAddr(amx, params[2], &str_addr);
                amx_SetString(str_addr, element.c_str(), 0, 0, element.size() + 1);
 
                return cell{1};
            }
        }
 
        piece = strtok({}, DELIMITERS);
    }
 
    cell* str_addr{};
    amx_GetAddr(amx, params[2], &str_addr);
    amx_SetString(str_addr, "", 0, 0, 1);
 
    return cell{0};
}
1
 Аватар для leo7755
3 / 3 / 1
Регистрация: 12.02.2017
Сообщений: 81
22.08.2021, 20:37
Алексей1153,
Code
1
2
return cell{1};
return cell{0};
потому что перед ф-ей слева явно указано, что она cell?
на счёт constexpr не очень понял. я читал про его использование, но так и не увидел смысла

Цитата Сообщение от Алексей1153 Посмотреть сообщение
piece = strtok({}, DELIMITERS);
{} - а так разве разрешено? замена нулю? я протестил, но стоит ли так оставить))
0
фрилансер
 Аватар для Алексей1153
6495 / 5723 / 1133
Регистрация: 11.10.2019
Сообщений: 15,284
22.08.2021, 20:50
Цитата Сообщение от leo7755 Посмотреть сообщение
потому что перед ф-ей слева явно указано, что она cell?
потому что всё равно 1 и 0 (у них тип int) будут приведены к типу cell. А потом вдруг кто-то решит поменять алиас cell, а тут останутся магические константы

Цитата Сообщение от leo7755 Посмотреть сообщение
на счёт constexpr не очень понял. я читал про его использование, но так и не увидел смысла
это константа времени компиляции
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <cstdlib>
 
//алиас
using cell=int32_t;
//назначение констант не знаю, поэтому такое странное название
constexpr cell cell_code_0{0};
constexpr cell cell_code_1{1};
 
cell func()
{
    return cell_code_1;
}
 
int main()
{
    func();
}
Цитата Сообщение от leo7755 Посмотреть сообщение
{} - а так разве разрешено?
это пустой список инициализации. Все встроенные типы заполняет нулями, указатели - nullptr
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.08.2021, 20:50

Оптимально ли использовать методы расширения для проверки на 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 =...


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

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Новые блоги и статьи
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
сукцессия 15 неявная схема
anaschu 29.06.2026
Алиса Калибровка параметров симбиотической модели: технический обзор Содержание: Введение Постановка проблемы Технические аспекты реализации Процесс внедрения изменений
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии Введение Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np class PlantAgent: def __init__(self, name, strategy, initial_biomass): self. name = name self. strategy = strategy # "greedy" (широколиственные) или. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru