Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.76
Owyn
0 / 0 / 0
Регистрация: 28.05.2009
Сообщений: 64
#1

Арифметика указателей - C++

27.08.2010, 11:41. Просмотров 3380. Ответов 15
Метки нет (Все метки)

есть
C++
1
2
size_t * pointer_1;
logfile_f("\npointer_1 is 0x%X", pointer_1);
есть
C++
1
2
size_t * pointer_2 = pointer_1 - 284;
logfile_f("\npointer_2 is 0x%X", pointer_2);
в итоге же:

pointer_1 is 0x465B414
pointer_2 is 0x465AFA4
pointer_1 - pointer_2 == 470
pointer_2 - pointer_1 == -1 136
мб я чего то не знаю о вычитании в математики?

пс - я конечно уже заюзал асм вставку, тк асм куда проще хитрозакрученного С++, но все же интересно что с С++ не так.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.08.2010, 11:41
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Арифметика указателей (C++):

арифметика указателей - C++
Здравствуйте. Объясните, пожалуйста, код из инета: 1. "переменная A типа int приводится к типу unsigned" приводится к бесзнаковому...

Индексация массивов, арифметика указателей - C++
инициализирую одномерный массив и делаю на него указатель const int N = 6; int X = {9,3,2,3,6,8}; int *mas = X; ...

Арифметика указателей (указатель на void*) - C++
У меня есть указатель на void*, который я получил с помощью void *beginPointer = VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE);Мне...

Способы создания объектов и арифметика указателей - C++
Вот сам код: class ListNode { public: ListNode(int val) { next=NULL; i=val; } ListNode*...

Замена максимального элемента массива на среднее арифметическое (арифметика указателей) - C++
Написать программу, которая заменяет значение максимального элемента массива на среднее арифметическое элементов массива. Массив из 8 целых...

Объяснить от чего зависит размер указателя и что такое арифметика указателей - C++
Уважаемые программисты, возник вопрос. По умолчанию указатель любого типа может иметь только 4 байта. Но взглянем на следующий код: ...

15
oxotnik
1601 / 1078 / 36
Регистрация: 21.08.2008
Сообщений: 4,541
Записей в блоге: 1
27.08.2010, 11:57 #2
эти две операции выполнялись в одном потоке, или на каждый раз заново запускалась программа?
0
Owyn
0 / 0 / 0
Регистрация: 28.05.2009
Сообщений: 64
27.08.2010, 12:04  [ТС] #3
идут сразу друг за другом, т.е. один поток, после перезапусков программы результат смещения такой же, -470 вместо указанных мною -284
0
NightmareZ
1398 / 610 / 38
Регистрация: 31.03.2009
Сообщений: 1,978
27.08.2010, 12:06 #4
Цитата Сообщение от Owyn Посмотреть сообщение
мб я чего то не знаю о вычитании в математики?
Пожалуй, да. Раздели 1136 на 284. Посмотри что получится, подумай, и начинай читать книжки по основам C/C++.
0
fasked
Эксперт С++
4975 / 2555 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
27.08.2010, 12:06 #5
Арифметика указателей. 284 можете смело умножить на sizeof(size_t).
При таком смещении указатель смещается на количество элементов типа в памяти.
1
Owyn
0 / 0 / 0
Регистрация: 28.05.2009
Сообщений: 64
27.08.2010, 12:25  [ТС] #6
Цитата Сообщение от fasked Посмотреть сообщение
Арифметика указателей. 284 можете смело умножить на sizeof(size_t).
При таком смещении указатель смещается на количество элементов типа в памяти.
почти помогло
size_t * pointer_2 = pointer_1 - (284 * sizeof(size_t));

pointer_1 is 0x49E4924
pointer_2 is 0x49E3764

т.е. pointer_1 - pointer_2 == 284*16

зато теперь понял почему С++ делает фигню и что можно скастовать тип перед операцией чем мучать *опу

C++
1
size_t * pointer_2 = (size_t *) ( (size_t)(pointer_1) - 284 )
0
NightmareZ
1398 / 610 / 38
Регистрация: 31.03.2009
Сообщений: 1,978
27.08.2010, 12:27 #7
Цитата Сообщение от Owyn Посмотреть сообщение
почти помогло
size_t * pointer_2 = pointer_1 - (284 * sizeof(size_t));


Не по теме:

А я говорил, что надо почитать основы C/C++, но меня никто не послушал и продолжает писать ахинею.



Зачем ты вот это сейчас делаешь?

Цитата Сообщение от Owyn Посмотреть сообщение
зато теперь понял почему С++ делает фигню и что можно скастовать тип перед операцией чем мучать *опу

C++
1
size_t * pointer_2 = (size_t *) ( (size_t)(pointer_1) - 284 )
Вротмненоги
0
fasked
Эксперт С++
4975 / 2555 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
27.08.2010, 12:35 #8
Цитата Сообщение от Owyn Посмотреть сообщение
почти помогло
size_t * pointer_2 = pointer_1 - (284 * sizeof(size_t));
Вообще я немного не это имел в виду.
C
1
size_t * pointer_2 = pointer_1 - 284;
Такой код означает, что смещение произведется на 284 элемента size_t. То есть на (284 * sizeof(size_t)) байт. Если хочешь сместить на 284 байта, то надо делить. Хотя я бы так делать тоже не стал.
C
1
size_t * pointer_2 = pointer_1 - (284/sizeof(size_t));
зато теперь понял почему С++ делает фигню и что можно скастовать тип перед операцией чем мучать *опу
Это неправильный подход.
0
NightmareZ
1398 / 610 / 38
Регистрация: 31.03.2009
Сообщений: 1,978
27.08.2010, 12:40 #9
Цитата Сообщение от fasked Посмотреть сообщение
C
1
size_t * pointer_2 = pointer_1 - (284/sizeof(size_t));
А, если бы число было не 284, а, например, 5, то поделив пять на sizeof(size_t) (допустим, что оно равно 4), получил бы 1 вместо 1.25, ибо целочисленное деление
0
fasked
Эксперт С++
4975 / 2555 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
27.08.2010, 12:42 #10
Цитата Сообщение от NightmareZ Посмотреть сообщение
А, если бы число было не 284, а, например, 5, то поделив пять на sizeof(size_t) (допустим, что оно равно 4), получил бы 1 вместо 1.25, ибо целочисленное деление
Поэтому я и написал, что не стал бы так делать
Согласитесь, глупо смещать указатель на 4-байтовый тип на 5 байт.
0
NightmareZ
1398 / 610 / 38
Регистрация: 31.03.2009
Сообщений: 1,978
27.08.2010, 12:43 #11
Цитата Сообщение от fasked Посмотреть сообщение
Поэтому я и написал, что не стал бы так делать
Согласитесь, глупо смещать указатель на 4-байтовый тип на 5 байт.
Согласен.
0
Owyn
0 / 0 / 0
Регистрация: 28.05.2009
Сообщений: 64
27.08.2010, 13:04  [ТС] #12
Цитата Сообщение от fasked Посмотреть сообщение
Это неправильный подход.

чем? он смещает именно на столько байтов, на сколько нужно, безо всяких выкрутасов вроде деления на размер типа


Согласитесь, глупо смещать указатель на 4-байтовый тип на 5 байт.
почему же? а если там после 4-байтового size_t идет 1-байтовый char и потом опять size_t например?
0
fasked
Эксперт С++
4975 / 2555 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
27.08.2010, 13:15 #13
Цитата Сообщение от Owyn Посмотреть сообщение
чем? он смещает именно на столько байтов, на сколько нужно, безо всяких выкрутасов вроде деления на размер типа
Таким образом адрес записывается в переменную типа size_t, в общем случае неправильно адрес хранить в такой переменной.
Цитата Сообщение от Owyn Посмотреть сообщение
почему же? а если там после 4-байтового size_t идет 1-байтовый char и потом опять size_t например?
Это было бы уже неправильное применение вообще указателей, а не только их арифметики. Смещать указатель произвольно по всей памяти, увольте.
Если хотите получить char используйте указатель на char, а не size_t.
0
Owyn
0 / 0 / 0
Регистрация: 28.05.2009
Сообщений: 64
27.08.2010, 13:19  [ТС] #14
Если хотите получить char используйте указатель на char, а не size_t.
я и не хочу, мне нужен указатель на size_t

хранить в такой переменной.
многие хранят поинтеры вообще в int, мне сказали что лучше их хранить в size_t,

а в какого типа переменной правильно их хранить? в void или DWORD?
0
NightmareZ
1398 / 610 / 38
Регистрация: 31.03.2009
Сообщений: 1,978
27.08.2010, 13:21 #15
Цитата Сообщение от Owyn Посмотреть сообщение
я и не хочу, мне нужен указатель на size_t


многие хранят поинтеры вообще в int, мне сказали что лучше их хранить в size_t,

а в какого типа переменной правильно их хранить? в (void *) или (dword *)?
В зависимости от того, на данные какого типа указывает указатель.
0
27.08.2010, 13:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.08.2010, 13:21
Привет! Вот еще темы с ответами:

по поводу указателей. Как правильно задавать массив указателей и его удалять? - C++
Т.е., например создаю указатель: TPoint *p_Point=NULL; а если массив? TPoint *p_MassPoint; //=?; как массив обнулить не ясно ...

Почему в сортировке указателей на объекты в вызове функции используются адреса объектов, а не указателей? - C++
Доброго времени суток! Рассматриваю пример (из Лафоре) сортировки массива указателей на объекты, для чего используются указатели на...

Объяснить различия в работе указателей на целое число и указателей на const char (строки в стиле Си) - C++
Уважаемые программисты, возникло несколько вопросов касательно указателей. Почему при выводе указателя на int нужна звёздочка (*), а...

Создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей - C++
Задача: создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей. Вернуть адрес...


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

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

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