Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Nubila
2 / 2 / 1
Регистрация: 24.03.2017
Сообщений: 59
1

Арифметика по ячейкам памяти

04.05.2017, 12:31. Просмотров 741. Ответов 6

Доброго времени суток! Сижу вот, и продумываю всякие нестандартные ситуации (которые вряд ли встретятся на практике) и не могу понять следующее: Почему этот участок кода работает:
C++
1
char a = const_cast<char*>("ab");
и выводит в поток cout значение а (тут понятно , так как есть невидимый константный указатель на первый элемент с-style строки и элемент находящийся по его адресу является - а)
но вот этот выкидывает исключение :
C++
1
char a = (*const_cast<char*>("ab"))++;// идея в том, что бы присвоить переменной а , не символ а  ,  а символ b;
А так же есть ещё одно:
C++
1
2
3
4
5
const int n = 5;
int arr[n] = { 1, 2, 3, 4, 5 };
for (int i = 0; i < n; i++)
    cout << i[arr] << " ";
cout << endl;
В моём представлении оператор индексирования в общем формате вызывается так: объект_класса[индекс]
А в данном случае объект является переменная int i и у неё как индекс передаётся const указатель на первый элемент массива..... Это немного сбивает с пути.
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.05.2017, 12:31
Ответы с готовыми решениями:

Распределение памяти и адресная арифметика
Добрый день. Помогите с заданием пожалуйста... Задание №1 1. Описание переменных предварительно...

Обращение к ячейкам памяти .Net C# (С++?)
Здравствуйте форумчане Я начинающий .net программист и у меня возникли такие вопросы Есть ли...

Обращение к ячейкам памяти: прокомментировать код
Помогите с комментариями к коду, не очень понял его. Кому не трудно к каждой сроке комментарий...

Как можно обращаться к ячейкам памяти, выделенными функцией malloc?
Сейчас прохожу курс CS50, там есть такой код: #include &lt;cs50.h&gt; #include &lt;ctype.h&gt; #include...

Цикл по ячейкам
Здравствуйте. помогите пожалуйста понять где я туплю. Dim i As Integer Dim j As Integer Dim k...

6
Max Dark
шКодер самоучка
2029 / 1787 / 880
Регистрация: 09.10.2013
Сообщений: 3,936
Записей в блоге: 6
Завершенные тесты: 2
04.05.2017, 12:43 2
Цитата Сообщение от Nubila Посмотреть сообщение
но вот этот выкидывает исключение
попытка модификации константы
код равносилен
C++
1
char a = ("ab"[0])++;// попытка модификации символа 'a' из константы
Цитата Сообщение от Nubila Посмотреть сообщение
А так же есть ещё одно
для массивов работает адресная арифметика и i[arr] превращается в *(i + arr) - получение значения по адресу (смещение + начальный адрес)
0
Nubila
2 / 2 / 1
Регистрация: 24.03.2017
Сообщений: 59
04.05.2017, 12:53  [ТС] 3
Max Dark, со вторым я запомнил. Но в
C++
1
char a = (*const_cast<char*>("ab"))++;
Я как бы пытаюсь константный указатель на первый элемент сделать не константным с помощью cast'ыля , и постфиксным икрементом двигаюсь на след. символ и присваиваю переменной а. Разве движение не произойдёт?
0
Max Dark
шКодер самоучка
2029 / 1787 / 880
Регистрация: 09.10.2013
Сообщений: 3,936
Записей в блоге: 6
Завершенные тесты: 2
04.05.2017, 13:01 4
Цитата Сообщение от Nubila Посмотреть сообщение
Разве движение не произойдёт?
Нет, так как разыменование указателя происходит до инкремента.

Добавлено через 3 минуты
В добавок, вы используете постинкремент, а он возвращает старое значение и только потом увеличивает
C++
1
2
3
4
5
6
// аналог для var++
int post_inc(int & var) {
    int old = var;
    var = var + 1;
    return old;
}
0
Nubila
2 / 2 / 1
Регистрация: 24.03.2017
Сообщений: 59
04.05.2017, 13:10  [ТС] 5
Max Dark, О! Точно, вы правы! Прошу прощения, забыл про return temp ... но ситуация с
C++
1
char a = ++(*const_cast<char*>("ab"))
аналогична... То есть , кроме как создания char указателя и присвоение ему инкремента ++a способа достать b больше нет?
0
Max Dark
шКодер самоучка
2029 / 1787 / 880
Регистрация: 09.10.2013
Сообщений: 3,936
Записей в блоге: 6
Завершенные тесты: 2
04.05.2017, 13:18 6
Лучший ответ Сообщение было отмечено Nubila как решение

Решение

Nubila,
C++
1
char a = *("ab" + 1);
1
Nubila
2 / 2 / 1
Регистрация: 24.03.2017
Сообщений: 59
06.05.2017, 09:14  [ТС] 7
Max Dark, Безмерно вам благодарен!
0
06.05.2017, 09:14
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.05.2017, 09:14

Обращение к ячейкам в БД
Здравствуйте, Пипл!! У меня такой вопрос: Как можно обращаться к ячейкам в БД (использовать...

Клики по ячейкам
Здравствуйте! У меня есть таблица: &lt;table&gt; &lt;tbody&gt; &lt;tr&gt; ...

Перенос по ячейкам
Всем привет. возникла небольшая проблемка. есть довольно длинный текст. есть таблица ячейка в...


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

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

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