Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.66/56: Рейтинг темы: голосов - 56, средняя оценка - 4.66
25 / 25 / 19
Регистрация: 13.07.2015
Сообщений: 433

Указатели в с++ указывают только на адрес?

25.08.2015, 23:39. Показов 13871. Ответов 213
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Например указатель int *p; Он может инициализироваться только адресом?(и ничем другим) например *p=&s
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.08.2015, 23:39
Ответы с готовыми решениями:

Убедиться, что адрес первого элемента массива и адрес, хранящийся в указатели на этот массив равны.
Убедиться, что адрес первого элемента массива и адрес, хранящийся в указатели на этот массив - равны.

Указатели, адрес переменной
int main(коллеги!) Снова прошу меня поправить! Есть такой пример: int *ptr; // переменная - ptr, указывает на - int...

Указатели и ссылки. Как сохранить адрес?
Небольшая путаница с указателями и ссылками. Допустим,есть некий указатель p1, который указывает на экземпляр класса a1 в динамической...

213
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
28.08.2015, 11:59
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Tulosba Посмотреть сообщение
- Здесь нет разыменовывания;
- К тому же возможна потеря данных, если sizeof(int)<sizeof(int*) (например на x64);
- Сишный каст будет интерпретирован как reinterpret_cast, что в итоге уже говорит о платформозависимости данного кода. Т.е. не UB, но непереносимо.
Да речь не об этом. Я прекрасно понимаю, что в x64 будет потеря данных, но в данном случае сути не меняет. В указателе содержится число (адрес) и ничего другого быть не может. Исходя из этого UB можно трактовать только так, что при nt *p = 0; В p может реально записаться не 0. Других вариантов у меня нет. Код я и привел, чтобы показать это.

Добавлено через 5 минут
Цитата Сообщение от ct0r Посмотреть сообщение
Осиль поиск по стандарту.
Если честно, мне эта цитата не о чем не говорит. Все зависит от того, как там определяется "invalid pointer value".
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
28.08.2015, 12:17
Цитата Сообщение от shmkv Посмотреть сообщение
В p может реально записаться не 0.
Как я уже говорил ранее в этой теме:
Цитата Сообщение от Tulosba Посмотреть сообщение
В общем случае, имхо, есть разница:
C++
1
2
void* ptr1 = reinterpret_cast<void*>(0); // Указатель на нулевой адрес в конкретной архитектуре
void* ptr2 = 0; // null pointer value в любой архитектуре (т.е. указатель, который гарантированно не может указывать на любой объект программы)
Т.е. битовое представление null pointer и битовое представление целого числа 0 не обязаны совпадать.
При этом в присваивании
C++
1
void* ptr = 0;
происходит не копирование битовых представлений, а присваивании указателю значения "null pointer constant" (см. п.4.10 Стандарта).
Цитата Сообщение от ct0r Посмотреть сообщение
Indirection through an invalid pointer value and passing an invalid pointer value to a deallocation function have undefined behavior.
Так это из раздела Dynamic storage duration, а в текущем обсуждении new/delete не присутствует.
1
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
28.08.2015, 12:28
Цитата Сообщение от Mr.X Посмотреть сообщение
И некоторые, к сожалению, с ней не справились.
Если ты про мой пример, то в нём нет UB.
0
99 / 46 / 18
Регистрация: 09.08.2015
Сообщений: 367
28.08.2015, 12:30
Цитата Сообщение от shmkv Посмотреть сообщение
А что? Что может храниться в указателе кроме числа?
Так я об этом и говорю что физически там ничего кроме числа не может быть, а логически там может быть пусто, поэтому выбрали одно число и обозвали его null чтобы обозначало ничего.
0
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
28.08.2015, 12:32
Цитата Сообщение от Tulosba Посмотреть сообщение
Т.е. битовое представление null pointer и битовое представление целого числа 0 не обязаны совпадать.
Хорошо, приму к сведению, что гипотетически могут существовать компиляторы в которых
C++
1
2
3
void* ptr1 = reinterpret_cast<void*>(0);
void* ptr2 = 0;
//ptr1 != ptr2
А как быть с сишным NULL? И как тогда корректно по Стандарту обратиться по нулевому адресу в pure Си? Там, судя по длинной статье разыменование NULL тоже формально UB.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
28.08.2015, 12:33
Цитата Сообщение от Tulosba Посмотреть сообщение
Разыменовывание - это ещё не UB, а вот использование разыменованного результата уже как бы да.
в стандарте сказанно - разыменовывание.
значит именно разыменовывание.

Цитата Сообщение от Tulosba Посмотреть сообщение
Аналогичное поведение можно наблюдать с итератором, который возвращается std::end(): сравнивать текущий с ним можно, но разыменовывать такой итератор нельзя.
ага. разыменовывать такой итератор нельзя

Цитата Сообщение от Tulosba Посмотреть сообщение
В Стандарте на этот счет на самом деле довольно мутно. Некоторые обсуждения по теме внесения правок в Стандарт тут.
на этот счет все вполне конкретно и определенно.
а что касается правок - вот когда их внесут, если вообще внесут,
тогда и будет другая речь.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
28.08.2015, 12:36
Цитата Сообщение от castaway Посмотреть сообщение
Если ты про мой пример, то в нём нет UB.
Из твоего примера:
C++
1
2
A * a = nullptr;
a->foo();
А теперь почитай тут.
0
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
28.08.2015, 12:37
Цитата Сообщение от AncientPenguin Посмотреть сообщение
а логически там может быть пусто
Вот эта фраза мне не понятна.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
28.08.2015, 12:45
Цитата Сообщение от Tulosba Посмотреть сообщение
А теперь почитай тут.
Почитай тему. По-моему я дал ясно понять что не согласен с этим пунктом языка. И мой пример тому подтверждение.

AncientPenguin, будь ты немного умнее, ты бы стал подтверждать свои знания на практике, а не кидаться глупыми выражениями о маркерах, которых даже язык не описывает.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
28.08.2015, 12:52
Цитата Сообщение от shmkv Посмотреть сообщение
А как быть с сишным NULL? И как тогда корректно по Стандарту обратиться по нулевому адресу в pure Си?
Из C99 п.7.17:
The macros are NULL which expands to an implementation-defined null pointer constant;
Т.е. можно сказать, что там где в "нулевой" адрес обращаться можно, значение NULL будет не нулевое. Вот и всё.
Цитата Сообщение от hoggy Посмотреть сообщение
ага. разыменовывать такой итератор нельзя
Ок. Не оч.удачно сформулировалось Просто разыменование итератора - это уже получение данных, а значит использование результата. Всё-таки итератор это не просто "обычный указатель".
24.2.1/5 Just as a regular pointer to an array guarantees that there is a pointer value pointing past the last element of the array, so for any iterator type there is an iterator value that points past the last element of a
corresponding sequence. These values are called past-the-end values. Values of an iterator i for which the
expression *i is defined are called dereferenceable. The library never assumes that past-the-end values are
dereferenceable.
Цитата Сообщение от hoggy Посмотреть сообщение
на этот счет все вполне конкретно и определенно.
Так приведи цитату однозначную, раз всё так конкретно по твоим словам.
Цитата Сообщение от hoggy Посмотреть сообщение
вот когда их внесут, если вообще внесут,
Вот тогда и можно будет говорить про "конкретно и определенно". А пока - нет.

Добавлено через 2 минуты
Цитата Сообщение от castaway Посмотреть сообщение
Почитай тему.
Хе. Ты думаешь я тему не читал? Просто тут спор идет уже по разным фронтам. А в данном конкретном случае, я всё-таки не согласен с тем, что отрывок кода:
C++
1
2
A * a = nullptr;
a->foo();
не содержит UB.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
28.08.2015, 12:57
Tulosba, хотя, я позволю немного поправить себя. Поскольку UB - это неопределённое поведение, то в некоторых случаях оно может быть определённым, а в некоторых и нет. В данном случае оно определено и безопасно.

Добавлено через 1 минуту
Цитата Сообщение от Tulosba Посмотреть сообщение
что отрывок кода не содержит UB.
В данном случае не содержит.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
28.08.2015, 13:23
castaway, говоря про UB (Undefined behaviour), имеется в виду отсутствие регламентированного поведения на любом компиляторе по Стандарту языка, на любом железе. А не про какой-то конкретный случай, с каким-то конкретным компилятором, на каком-то конкретном железе, выполненный в определенное время.
Именно по этому, твоё выражение
Цитата Сообщение от castaway Посмотреть сообщение
В данном случае не содержит.
Не соответствует действительности, т.к. "не проявляется" и "не содержит" это не одно и тоже.

Не по теме:

Видишь суслика? Нет. А он есть! (с)

0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
28.08.2015, 13:37
Пусть будет так. Изначально я хотел показать что любой указатель содержит адрес, в том числе нулевой (есть тут некоторые персонажи, которые считают иначе). Спор про UB тут приплелся как то неожиданно...
0
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
28.08.2015, 13:49
Цитата Сообщение от Tulosba Посмотреть сообщение
Т.е. можно сказать, что там где в "нулевой" адрес обращаться можно, значение NULL будет не нулевое. Вот и всё.
Из чего делаем вывод, что все DOS'овские компиляторы нагло нарушают Стандарт? И как быть ситуацией, когда все адресное пространство может быть валидно?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
28.08.2015, 14:24
Цитата Сообщение от shmkv Посмотреть сообщение
делаем вывод, что все DOS'овские компиляторы нагло нарушают Стандарт?
Я не понял, почему такой вывод у тебя получился. Поясни, плиз.
Цитата Сообщение от shmkv Посмотреть сообщение
И как быть ситуацией, когда все адресное пространство может быть валидно?
Реализация должна обеспечить существование null pointer, такого, что он будет отличен от любого другого:
4.10/1 ... A null pointer constant can be converted to a pointer type; the result is the null pointer
value of that type and is distinguishable from every other value of object pointer or function pointer type. ...
Как это будет сделано технически, если такая ситуация возникнет, уже другой вопрос. Но сделано быть должно.
0
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
28.08.2015, 14:31
Цитата Сообщение от Tulosba Посмотреть сообщение
не понял, почему такой вывод у тебя получился. Поясни, плиз.
Возьмем, для примера, TC.
C++
1
2
3
4
5
6
7
#ifndef NULL
#  if defined(__TINY__) || defined(__SMALL__) || defined(__MEDIUM__)
#      define NULL    0
#  else
#      define NULL    0L
#  endif
#endif
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
28.08.2015, 15:28
Цитата Сообщение от shmkv Посмотреть сообщение
Возьмем, для примера, TC.
И что здесь не так?
Помимо упомянутого ранее раздела из Стандарта C99, приведу из C++11:
18.2/3 The macro NULL is an implementation-defined C++ null pointer constant in this International Standard (4.10).
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
28.08.2015, 16:51
Цитата Сообщение от Tulosba Посмотреть сообщение
Просто разыменование итератора - это уже получение данных, а значит использование результата.
вот это ваше высказывание оч сильно неоднозначно.

потому что согласно вашим же тезисам:

Цитата Сообщение от Tulosba Посмотреть сообщение
A * a = nullptr;
a->foo();
содержит UB.

а значит, разыменовывать нулевой указатель - это UB.



Цитата Сообщение от Tulosba Посмотреть сообщение
Так приведи цитату однозначную, раз всё так конкретно по твоим словам.
у меня под рукой нет документа.

ну вот если загуглить, то попадается всякое:

8.3.2 References

a null reference cannot exist in a
well-defined program, because the only way to create such a reference would be to bind it to the “object”
obtained by indirection through a null pointer, which causes undefined behavior.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
28.08.2015, 17:22
Цитата Сообщение от hoggy Посмотреть сообщение
содержит UB.
потому, что есть вызов foo() через указатель, которые НЕ указывает на объект.
Просто разыменование (без использования результата) не приводит к UB:
C++
1
2
3
4
5
6
7
int main()
{
    int* p = 0;
    *p; // legal
    *p = 0; // segfault
    int i = *p; // segfault
}
Цитата Сообщение от hoggy Посмотреть сообщение
вот если загуглить, то попадается всякое:
Угу. В этой же теме несколько страниц назад
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
28.08.2015, 17:37
Цитата Сообщение от Tulosba Посмотреть сообщение
Угу. В этой же теме несколько страниц назад
как вы можете жить с такими противоречиями?

результат разыменовывания - есть ссылка.

стандарт говорит - не может быть таких нулевых ссылок,
потому что что бы их получить, нужно разыменовать нулевой указатель,
что приводит к UB.

вы с этим соглашаетесь,
и тут же приводите диаметрально противоположную точку зрения:


C++
1
2
3
4
5
int main()
{
    int* p = 0;
    *p; // UB
}
эквивалент:

C++
1
2
3
4
5
int main()
{
    int* p = 0;
    int& ref = *p; // UB
}
но как известно, UB не гарантирует ошибку,
а компиляторы уже давным давно
научились оптимизировать неиспользуемые результаты,
и промежуточные вычисления.


и, как я не устаю повторять:
сначала компилятор проверяет синтаксис,
и только потом уже оптимизирует.

в ядре линука была обнаружена вот такая уязвимость:

C++
1
2
3
4
5
6
7
8
9
int main()
{
    some* p = 0;
 
    *p;
 
    if(p)
        p->work();
}
компилятор оптимизировал:

C++
1
2
3
4
5
int main()
{
    some* p = 0;
    p->work();
}
поскольку указатель уже был разыменован,
компилятор решил, что он обязан быть валидным.
а значит проверка на ноль - избыточная.

https://isc.sans.edu/diary/A+n... ility/6820
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.08.2015, 17:37

Вычислить адрес верхушки стека, адрес следующей команды, адрес переменной, адрес которой содержится в BX
Помогите решить следующие задачи: 1.Вычислить адрес верхушки стэка. 2.Вычислить адрес следующей выполняемой программы. 3. Вычислить...

Указатели - почему pNext работает как ссылка на следующий адрес?
struct Node { int value; struct Node* pNext; // ссылка на следующий адрес }; struct AddressInfo { char name; char...

Массивы и Указатели: распечатать таблицу,содержащую имя переменной,ее значение и адрес
Условие:Написать программу,которая создает несколько переменных целого и вещественного типа,для каждой переменной создает указатель,а затем...

хочу только адрес страници
Вот я замечал порой заходя на сайт что, где нормально пишешь название сайта скажем www.aaa.com то на некоторых сайтах когда заходишь то...

Частный адрес, динамический адрес, статический адрес - какой у меня?
Привет. Открываем рубрику глупых вопросов. Я сижу с компьютера который подключен к интернету по кабелю, кабель от компьютера идёт к...


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

Или воспользуйтесь поиском по форуму:
140
Закрытая тема Создать тему
Новые блоги и статьи
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Задача: Программно добавить префикс в нумерацию документов в самописной конфигурации на БСП (помощь начинающему коллеге). Решение: В модуле объекта документа размещен следующий код: Процедура. . .
После закрытия оутлука продолжает висеть процесс в диспетчере задач
Maks 27.10.2026
С недавнего времени в продакшене возникла проблема: при закрытии оутлука в диспетчере задач продолжал висеть процесс outlook. exe. Проблема возникла после установки MS Office 2021 LTSC на машинах, под. . .
Baragoz - DPS/HPS бот для WoW 3.3.5a, многоязычный
AmbA 26.10.2026
Хотите ещё ботов? У меня есть один! А я пока отдохну от него. https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=12062&stc=1&d=1793007952 Инструкция внутри. https:/ / youtu. be/ VpfFZSUDGnQ. . .
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru