Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.90/30: Рейтинг темы: голосов - 30, средняя оценка - 4.90
1 / 1 / 0
Регистрация: 17.04.2018
Сообщений: 26

Проблемы с указателями

31.05.2022, 02:03. Показов 6243. Ответов 64

Есть вот такой код:

C++
1
2
3
4
5
6
int main 
    {
        int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        int *p1 = arr, *p2 = arr + 4;
        cout << p2 + p1;
    }
1) Я не понимаю почему это выражение не выводит адрес? Ведь p2 и p1 не разыменованы?
2) Почему не получается складывать p2 и p1? При сложении у меня выходит ошибка, а при вычитании все в порядке.
3) И что еще я не могу понять, так это почему при выражении p1 - p2 выходит отрицательное число?

Для меня в теме указателей это 3 не понятных момента. В особенности я не пойму почему мы не разыменовываем все это. Как при таком подходе получается целое число а не 16-тиричное число?
Вот например есть код.

C++
1
2
3
int a = 2;
int *b = a;
cout << *a;
тут мы получим целое число только разыменовав переменную a. А в случае выше все как-то само происходит.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.05.2022, 02:03
Ответы с готовыми решениями:

Проблемы с указателями
Никак не могу исправить ошибки: 1) &quot;void push_back(char,int,char)&quot;: невозможно преобразовать аргумент 1 из &quot;char *&quot; в...

Проблемы с указателями
Всем привет! Нужна Ваша помощь. Есть задачка - написать функцию, которая принимает строку в качестве аргумента и удаляет из этой строки все...

Новая видеокарта, новые проблемы №2. Проблемы с вводом и выводом звуков
После покупки более новой видеокарты и последующего подключения ее через hdmi кабель, на компьютере полностью пропал звук через заднюю и...

64
Нарушающий
417 / 305 / 46
Регистрация: 13.04.2022
Сообщений: 1,759
02.06.2022, 06:34
Хотя С++ стандарт уже *давно* разрешил delete через const указатель, мне бы хотелось создать класс который это не позволяет.

C++
1
2
3
4
5
6
7
8
9
10
class T 
{
.. some magic
};
 
  const T* pc = NULL;
  T* p = NULL;
 
  delete pc; // тут хочу ошибку компиляции
  delete p;  // тут должно работать как раньше.
Кто-то знает как это возможно сделать в современном С++?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
02.06.2022, 13:48
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Вы же уже упоминали эти баги в старинных версиях MSVC++ и пр. компиляторах ранее. В былые времена в них столько багов было - закачаешься...
Конкретно это никакой не баг. В том смысле, что на момент разработки этих компиляторов, это была вполне официальная позиция. В версии С++ до официальной стандартизации, в той, что описана в ARM, действительно было прямое требование о запрете delete для указателей на const. Я вот тут сделал парочку фотографий из этой книжки:

0
Нарушающий
417 / 305 / 46
Регистрация: 13.04.2022
Сообщений: 1,759
02.06.2022, 20:19
Порылся в стандарте, поигрался с компилятором.

Отключить оператор delete оказалось довольно просто, и его отсутствие не мешает созданию/уничтожению автоматических конст переменных.

это запретило delete const объектов, или delete const указателей и заставило пользоваться не-конст member function del().

Не слишком элегантно, но ответило на мой вопрос.

Кликните здесь для просмотра всего текста
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
#include <iostream>
using namespace std;
 
class T
{
//  static void operator delete (void*, ...);
public:
  int n;
  T(int x=5) { n = x; cout << n << " created\n"; }
  ~T() { cout << n << " destroyed\n"; }
  static void operator delete (void*, ...) = delete;
  void del() { ::delete this; } ;  // non-const
};
 
int main()
{
  const T t = 8;
  T* p = new T(6);
  p->del();
 
  const T* q = new T;
  delete q; // gives error
  q->del(); // also error
}
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13207 / 6841 / 1823
Регистрация: 18.10.2014
Сообщений: 17,304
03.06.2022, 00:02
Цитата Сообщение от QueryMonkey Посмотреть сообщение
это запретило delete const объектов, или delete const указателей и заставило пользоваться не-конст member function del().
Почему только del()? Никто не запретил пользователю явно пользоваться ::new и ::delete

C++
1
2
  const T *q = ::new const T;
  ::delete q;
0
Нарушающий
417 / 305 / 46
Регистрация: 13.04.2022
Сообщений: 1,759
03.06.2022, 01:46
TheCalligrapher,

Меня интересовал вопрос, можно ли предотвратить ненамеренный вызов delete на конст-объекте или конст-указателе, т.к. это лучше укладывается в мои привычки. Я привык что функции декларированные с const параметром не изменяют свойства объекта, в том числе не разрушают его.

Всегда можно перекастить в неконст или иначе "обхитрить" конст, запретить такое в рамках С++ вряд ли возможно.
Мне нужно чтобы если в моем коде внутри конст-метода или внутри функции с конст-параметром уничтожается конст-объект, компилятор дал мне знать, а я уже решу хотел я этого или нет. Обычно нет, поэтому и спросил как это сделать.

На чужие библиотеки я не смогу повлиять, но будет повод добавить assert() после некоторых конст функций - а не удалили ли без спроса объект, который я давал лишь "посмотреть".

Возможно в будущем появится "delete const" или "delete nonconst" если кто-то в комитете озаботится такой проблемой.

Я узнал много нового про C++14 пока ковырял этот вопрос, возможно и ТС было интересно. Или будет интересно когда перечитает позже.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.06.2022, 01:46

Проблемы с инетом, не отправляется почта, проблемы со связью с другой организацией
Здравствуйте. Есть проблемка. Такая ситуация - Организация. Компьютеры подключены по локалке. Находятся в домене. Интернет есть, но! не...

Yokogawa, шкаф, проблемы с драйвером на станции, проблемы соединения
Доброго времени суток, есть шкаф вот с таким оборудованием: Шкаф подключен к станции под управлением двух ос. Обе...

Непонятка с указателями
У меня есть типизированный файл, из которого нужно удалить запись. Я все данные сую в динам массив и затем перезаписываю файл с этого...

Работа с указателями
Доброго времени суток! Прошу помощи в решении очень интересной задачи. Перепробовал все свои знания., не получается( Чаще всего...

Массивы с указателями
Здравствуйте, помогите написать программу. Переписать сначала отрицательные, а затем положительные элементы массива BC, содержащего N...


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

Или воспользуйтесь поиском по форуму:
65
Ответ Создать тему
Новые блоги и статьи
Клиент
Uhbif79 18.06.2026
Здесь простой клиент для работы с сервером.
Сервер
Uhbif79 18.06.2026
Выкладываю простейший сервер.
Дефенестрация
kumehtar 18.06.2026
Узнал интересное слово. Дефенестрация. Это когда ты выбрасываешь кого-либо или что-либо из окна. Возьму на вооружение)))
Дихотомия добра и зла
kumehtar 18.06.2026
Как Дзен-буддисты говорят о добре и зле: не нужно воевать против зла, нужно воевать против невежества. Тогда добро станет ествественным, и поэтому вечным. Но дело в том, что невежество всё время. . .
Своя Интернет-Компания
iceja 18.06.2026
Я программист с экономическим образованием, пишу свой проект, это SaaS для бизнесов. Мне нужен co-founder с высшим экономическим образованием, и/ или инвестор. Сейчас проект в интенсивной разработке,. . .
24 Мат модель здравосохранения: функциональные требования к строительству пищеблока
anaschu 18.06.2026
СРесурсами1: финансовый SD-контур, калькулятор функциональных требований пищеблока Сегодня разделили затраты в агенте Экономика по образцу модели НАСОСЫ, добавили расчёт ROI и построили первый. . .
23. что сделано за последнее время.
anaschu 17.06.2026
• Эталон: Клиника НИИ питания РАМН, Москва — централизованный пищеблок, 225 коек, 180 пациентов • Git: репозиторий med2, ветка абсентеизм. Рабочий файл: СРесурсами1_v4. alp • Смежный проект:. . .
22. Подключение слоя системной динамики (потоковые диффуры): экономические метрики модели
anaschu 17.06.2026
Апдейт модели: финансовый контур, разделение затрат Продолжаю развивать модель рабочего коллектива на AnyLogic. В этот раз работа шла над агентом Экономика — финансовым SD-слоем модели. Задача:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru