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

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

31.05.2022, 02:03. Показов 5864. Ответов 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
31.05.2022, 07:48
(1) потому что (2)

(2) потому что два указателя запрещено складывать. Как в электричестве, разность потенциалов - это напряжение в вольтах, а сумма потенциалов не бывает.

(3) когда из меньшего вычитаешь большее, получаешь отрицательную разницу.
Что больше: p1 (=arr) или p2 (=arr+4) ?
0
Злостный нарушитель
 Аватар для Verevkin
10260 / 5684 / 1265
Регистрация: 12.03.2015
Сообщений: 26,366
31.05.2022, 08:25
Цитата Сообщение от Dante20171 Посмотреть сообщение
Есть вот такой код
Всё надо начинать с вопроса "Зачем всё это?".
Цель у тебя какая?
0
1 / 1 / 0
Регистрация: 17.04.2018
Сообщений: 26
31.05.2022, 10:27  [ТС]
Я осваиваю базу C++ и мне хочется разобраться с темой "указатели" раз и навсегда. Вот почему я интересуюсь из-за чего все это происходит

Добавлено через 1 минуту
На первый вопрос я так и не получил ответа
0
Злостный нарушитель
 Аватар для Verevkin
10260 / 5684 / 1265
Регистрация: 12.03.2015
Сообщений: 26,366
31.05.2022, 10:50
Цитата Сообщение от Dante20171 Посмотреть сообщение
Я осваиваю базу C++ и мне хочется разобраться с темой "указатели" раз и навсегда.
Это так не работает.
Цитата Сообщение от Dante20171 Посмотреть сообщение
На первый вопрос я так и не получил ответа
Цитата Сообщение от Dante20171 Посмотреть сообщение
1) Я не понимаю почему это выражение не выводит адрес? Ведь p2 и p1 не разыменованы?
Патамушта ошибка компиляции. Складывать/вычитать 2 адреса НЕЛЬЗЯ.
Но если очень хочется, то можно.
C++
1
2
3
4
5
6
7
8
#include <iostream>
#define QWORD_PTR(x) (unsigned long long)(x)
int main()
{
  int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  int *p1 = arr, *p2 = arr + 4;
  std::cout << QWORD_PTR(p2) + QWORD_PTR(p1);
}
Только НАХРЕНА?
0
1 / 1 / 0
Регистрация: 17.04.2018
Сообщений: 26
31.05.2022, 11:45  [ТС]
Вопрос в том, почему выводится целое число, а не адрес. Я же написал, что p не разыменован, но при этом выводится целое число, хотя по логике должен выводится адрес. Я даже внизу пример привел чего я не понимаю.
0
Злостный нарушитель
 Аватар для Verevkin
10260 / 5684 / 1265
Регистрация: 12.03.2015
Сообщений: 26,366
31.05.2022, 11:50
Цитата Сообщение от Dante20171 Посмотреть сообщение
Вопрос в том, почему выводится целое число, а не адрес. Я же написал, что p не разыменован, но при этом выводится целое число, хотя по логике должен выводится адрес. Я даже внизу пример привел чего я не понимаю.
Адрес - это число. Поэтому оно и выводится.
0
1 / 1 / 0
Регистрация: 17.04.2018
Сообщений: 26
31.05.2022, 11:55  [ТС]
Я задал вопрос "почему?", мне не нужно код писать с функциями которые я еще не понимаю. Я лишь объяснение хочу узнать, почему так происходит. Если ты мне первый объяснишь, я пойму думаю и второй вопрос.
Я экспериментирую с указателями сейчас. Все чего я хочу узнать, так это как pointer без разадресации отличается от той же допустим переменной с адресом &a. Надо было мне наверное так вопрос поставить
Потому что вот допустим если я впишу в *pointer переменную какую ни будь с числом, то вписав в cout просто pointer без звездочки, получу адрес этой переменной. Так почему при вычитании одного pointer из другого, я получаю целое число?) Почему не 16-тиричное число как с этим примером?
0
Злостный нарушитель
 Аватар для Verevkin
10260 / 5684 / 1265
Регистрация: 12.03.2015
Сообщений: 26,366
31.05.2022, 12:01
Цитата Сообщение от Dante20171 Посмотреть сообщение
Я задал вопрос "почему?"
Да ёп...

Цитата Сообщение от Dante20171 Посмотреть сообщение
Я лишь объяснение хочу узнать, почему так происходит.
Что именно у тебя происходит-то?
1
1 / 1 / 0
Регистрация: 17.04.2018
Сообщений: 26
31.05.2022, 12:01  [ТС]
разве не вот так должно целое число выйти *(p1 - p2)? Почему без разадресации выводится целое? Прости конечно если туплю, но мне правда бы не помешала помощь в этом разобраться)
0
фрилансер
 Аватар для Алексей1153
6449 / 5643 / 1129
Регистрация: 11.10.2019
Сообщений: 15,029
31.05.2022, 12:01
Цитата Сообщение от Dante20171 Посмотреть сообщение
мне хочется разобраться с темой "указатели" раз и навсегда
указатель - это переменная, которая хранит адрес. Вот и всё разбирательство
0
Злостный нарушитель
 Аватар для Verevkin
10260 / 5684 / 1265
Регистрация: 12.03.2015
Сообщений: 26,366
31.05.2022, 12:02
Цитата Сообщение от Dante20171 Посмотреть сообщение
Так почему при вычитании одного pointer из другого, я получаю целое число?
А чего ты ожидал получить?
0
фрилансер
 Аватар для Алексей1153
6449 / 5643 / 1129
Регистрация: 11.10.2019
Сообщений: 15,029
31.05.2022, 12:03
Dante20171, разница двух адресов - это расстояние (не адрес)
1
Злостный нарушитель
 Аватар для Verevkin
10260 / 5684 / 1265
Регистрация: 12.03.2015
Сообщений: 26,366
31.05.2022, 12:12
Цитата Сообщение от Dante20171 Посмотреть сообщение
Прости конечно если туплю, но мне правда бы не помешала помощь в этом разобраться
Память - это длинный массив байтов.
У каждого байта есть адрес (целое неотрицательное число - смещение от начала массива).
В зависимости от разрядности ОС и компилятора, каждый байт адресуется 32-битным или 64-битным адресом.
Разадресация указателя - это чтение или запись значения по адресу, который хранится в указателе. Тип указателя нужен компилятору для определения размера куска памяти, который можно прпочитать/записать через разыменование указателя.
Code
1
2
3
4
5
char* - 1 байт со знаком
short* - 2 байта со знаком
unsigned* - 4 байта без знака
int64_t* - 8 байт со знаком
struct { int x, int y, int z} *  - 12 байт-ная структура
и т.д. и т.п.



Наперёд соглашусь, что символ "*" сильно дезориентирует. Ненавижу С/С++, в том числе, и за это.
1
фрилансер
 Аватар для Алексей1153
6449 / 5643 / 1129
Регистрация: 11.10.2019
Сообщений: 15,029
31.05.2022, 12:17
Verevkin, никуда он не дезориентирует, это часть типа
0
Злостный нарушитель
 Аватар для Verevkin
10260 / 5684 / 1265
Регистрация: 12.03.2015
Сообщений: 26,366
31.05.2022, 12:20
Цитата Сообщение от Алексей1153 Посмотреть сообщение
никуда он не дезориентирует, это часть типа
Я понимаю, что это часть типа.
А нубы - нет.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
31.05.2022, 13:55
Цитата Сообщение от Verevkin Посмотреть сообщение
вычитать 2 адреса НЕЛЬЗЯ
Вычитать можно.
0
Злостный нарушитель
 Аватар для Verevkin
10260 / 5684 / 1265
Регистрация: 12.03.2015
Сообщений: 26,366
31.05.2022, 14:01
Цитата Сообщение от DrOffset Посмотреть сообщение
Вычитать можно.
Я так и написал.



Чо не так-то?
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
31.05.2022, 14:03
Лучший ответ Сообщение было отмечено Dante20171 как решение

Решение

Цитата Сообщение от Dante20171 Посмотреть сообщение
И что еще я не могу понять, так это почему при выражении p1 - p2 выходит отрицательное число?
Цитата Сообщение от Dante20171 Посмотреть сообщение
разве не вот так должно целое число выйти *(p1 - p2)? Почему без разадресации выводится целое?
Вы живете в доме с номером 42. А ваш друг в доме с номером 46.
Дом с номером 42 - это адрес вашего дома, а дом с номером 46 - это адрес дома вашего друга.

Если вы вычтете из номера 42 номер 46, вы получите -4. Знак минус, потому что 42 меньше чем 46.
-4 не будет ничьим адресом, но будет разностью двух ваших адресов.
С указателями все точно так же. Только вместо домов адресуется память.

Добавлено через 47 секунд
Цитата Сообщение от Verevkin Посмотреть сообщение
Чо не так-то?
Адреса можно вычитать без всяких кастов.
1
Злостный нарушитель
 Аватар для Verevkin
10260 / 5684 / 1265
Регистрация: 12.03.2015
Сообщений: 26,366
31.05.2022, 14:06
Цитата Сообщение от DrOffset Посмотреть сообщение
Адреса можно вычитать без всяких кастов.
Да. Ну ладно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.05.2022, 14:06
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru