6 / 6 / 1
Регистрация: 28.09.2018
Сообщений: 396
|
|||||||||||
1 | |||||||||||
Арифметика указателей. Но больше precedence04.04.2019, 02:13. Показов 1859. Ответов 12
Всё хорошо до
Спасибо
0
|
04.04.2019, 02:13 | |
Ответы с готовыми решениями:
12
Удалить слова содержащие больше чем N символов с помощью указателей Арифметика указателей арифметика указателей Арифметика указателей |
2307 / 1133 / 702
Регистрация: 25.04.2016
Сообщений: 3,229
|
|
04.04.2019, 02:42 | 2 |
Сообщение было отмечено number_118 как решение
Решение
printf("--(*++b) = %d\n", --(*++b)); будет 29
--*b означает взять значение по адресу b и уменьшить на 1 *--b означает уменьшить адрес b на 1 и затем взять значение по получившемуся адресу Именно поэтому с инкрементами и декрементами в указателях стоит быть осторожнее, а лучше вообще не использовать без надобности, поскольку в зависимости от положения они могут менять адрес самого указателя.
1
|
6 / 6 / 1
Регистрация: 28.09.2018
Сообщений: 396
|
||||||
04.04.2019, 03:17 [ТС] | 3 | |||||
stake-k26, ну почему же не использовать?
Как раз суть арифметики указателей. Имя массива как указатель не можем изменять, поэтому записываем его в отдельный указатель, который и изменяем. Вроде и примеры существуют, по крайней меры демонстрационные:
Во-вторых. Увидел, что там же оно постфиксное - значит "используется потом". Если тут нет тех самых "точек следования", то тогда я бы ожидал 19, а не 18. Спасибо.
0
|
2307 / 1133 / 702
Регистрация: 25.04.2016
Сообщений: 3,229
|
|
04.04.2019, 03:56 | 4 |
0
|
6 / 6 / 1
Регистрация: 28.09.2018
Сообщений: 396
|
|
04.04.2019, 05:12 [ТС] | 5 |
stake-k26, но почему 18, а не 19?
P.S. В принципе, я понял: > меняют адрес самого указателя в зависимости от положения По-Вашему выходит, что причина - неопределённое поведение ( если я правильно употребляю термин ). Потому что в принципе, чтобы обратиться к адресу указателя, должно быть &p, чего тут нет.
0
|
2307 / 1133 / 702
Регистрация: 25.04.2016
Сообщений: 3,229
|
|
04.04.2019, 14:13 | 6 |
Сообщение было отмечено number_118 как решение
Решение
number_118, нет, вы неправильно поняли. Дело в том, что на предыдущем шаге вы делаете "--(*b) + 4" и если +4 ничего не изменяет, то --(*b) уменьшает значение a[1] на единицу, и у вас получается массив [10 19 30 40 50], и после этого вы выполняете "--*b++" - еще дополнительно уменьшаете a[1] на 1, т.е. теперь уже получается --19 = 18.
Вы бы это легко заметили, если бы после каждого шага выводили массив на экран.
1
|
6 / 6 / 1
Регистрация: 28.09.2018
Сообщений: 396
|
||||||
04.04.2019, 15:29 [ТС] | 7 | |||||
stake-k26 , немного не по теме сейчас напишу.
Вообще спасибо Вам. Только замечу следующее. Я код чз комментирование отключал-подключал, это же видно из кода выше Суть в том, что я упёрся в логику, разумеется, незаконную для констант, рода
Не по теме: Остаётся только удивляться себе.
0
|
83 / 59 / 29
Регистрация: 15.05.2013
Сообщений: 188
|
|
04.04.2019, 17:49 | 8 |
Это как понять? a остается равно 5 после присваивания или неверный комментарий?
0
|
2307 / 1133 / 702
Регистрация: 25.04.2016
Сообщений: 3,229
|
||||||
04.04.2019, 18:26 | 9 | |||||
shadowmaan, нет, а становится 4, смотрите:
0
|
83 / 59 / 29
Регистрация: 15.05.2013
Сообщений: 188
|
|
04.04.2019, 18:30 | 10 |
Верно. Я просто не понял ваших ожиданий из предыдущего отрывка кода.
0
|
2307 / 1133 / 702
Регистрация: 25.04.2016
Сообщений: 3,229
|
|
04.04.2019, 18:38 | 11 |
shadowmaan, в комментарии указана ошибка, которую допустил number_118, он думал, что после применения декремента значение переменной не изменится. Т.е. как вы и сказали: "a остается равно 5", но на самом деле это не так. Из-за этого он и допустил ошибку в своих вычислениях.
0
|
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
|
|||||||||||
04.04.2019, 18:43 | 12 | ||||||||||
Кликните здесь для просмотра всего текста
Здравствуйте. Имхо, так советовать писать новичкам не стоит. Для прочего существуют агрессивные режимы компилятора.
1
|
2307 / 1133 / 702
Регистрация: 25.04.2016
Сообщений: 3,229
|
||||||
04.04.2019, 18:44 | 13 | |||||
если в двух словах, то ошибка вот в этом:
0
|
04.04.2019, 18:44 | |
04.04.2019, 18:44 | |
Помогаю со студенческими работами здесь
13
Арифметика указателей (указатель на void*) Индексация массивов, арифметика указателей Способы создания объектов и арифметика указателей Как работает арифметика указателей, память массивов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |