Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.76
Owyn
0 / 0 / 0
Регистрация: 28.05.2009
Сообщений: 64
27.08.2010, 11:41     Арифметика указателей #1
есть
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
мб я чего то не знаю о вычитании в математики?

пс - я конечно уже заюзал асм вставку, тк асм куда проще хитрозакрученного С++, но все же интересно что с С++ не так.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
oxotnik
 Аватар для oxotnik
1584 / 1061 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
27.08.2010, 11:57     Арифметика указателей #2
эти две операции выполнялись в одном потоке, или на каждый раз заново запускалась программа?
Owyn
0 / 0 / 0
Регистрация: 28.05.2009
Сообщений: 64
27.08.2010, 12:04  [ТС]     Арифметика указателей #3
идут сразу друг за другом, т.е. один поток, после перезапусков программы результат смещения такой же, -470 вместо указанных мною -284
NightmareZ
 Аватар для NightmareZ
1336 / 559 / 37
Регистрация: 31.03.2009
Сообщений: 1,907
27.08.2010, 12:06     Арифметика указателей #4
Цитата Сообщение от Owyn Посмотреть сообщение
мб я чего то не знаю о вычитании в математики?
Пожалуй, да. Раздели 1136 на 284. Посмотри что получится, подумай, и начинай читать книжки по основам C/C++.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
27.08.2010, 12:06     Арифметика указателей #5
Арифметика указателей. 284 можете смело умножить на sizeof(size_t).
При таком смещении указатель смещается на количество элементов типа в памяти.
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 )
NightmareZ
 Аватар для NightmareZ
1336 / 559 / 37
Регистрация: 31.03.2009
Сообщений: 1,907
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 )
Вротмненоги
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 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));
зато теперь понял почему С++ делает фигню и что можно скастовать тип перед операцией чем мучать *опу
Это неправильный подход.
NightmareZ
 Аватар для NightmareZ
1336 / 559 / 37
Регистрация: 31.03.2009
Сообщений: 1,907
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, ибо целочисленное деление
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
27.08.2010, 12:42     Арифметика указателей #10
Цитата Сообщение от NightmareZ Посмотреть сообщение
А, если бы число было не 284, а, например, 5, то поделив пять на sizeof(size_t) (допустим, что оно равно 4), получил бы 1 вместо 1.25, ибо целочисленное деление
Поэтому я и написал, что не стал бы так делать
Согласитесь, глупо смещать указатель на 4-байтовый тип на 5 байт.
NightmareZ
 Аватар для NightmareZ
1336 / 559 / 37
Регистрация: 31.03.2009
Сообщений: 1,907
27.08.2010, 12:43     Арифметика указателей #11
Цитата Сообщение от fasked Посмотреть сообщение
Поэтому я и написал, что не стал бы так делать
Согласитесь, глупо смещать указатель на 4-байтовый тип на 5 байт.
Согласен.
Owyn
0 / 0 / 0
Регистрация: 28.05.2009
Сообщений: 64
27.08.2010, 13:04  [ТС]     Арифметика указателей #12
Цитата Сообщение от fasked Посмотреть сообщение
Это неправильный подход.

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


Согласитесь, глупо смещать указатель на 4-байтовый тип на 5 байт.
почему же? а если там после 4-байтового size_t идет 1-байтовый char и потом опять size_t например?
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
27.08.2010, 13:15     Арифметика указателей #13
Цитата Сообщение от Owyn Посмотреть сообщение
чем? он смещает именно на столько байтов, на сколько нужно, безо всяких выкрутасов вроде деления на размер типа
Таким образом адрес записывается в переменную типа size_t, в общем случае неправильно адрес хранить в такой переменной.
Цитата Сообщение от Owyn Посмотреть сообщение
почему же? а если там после 4-байтового size_t идет 1-байтовый char и потом опять size_t например?
Это было бы уже неправильное применение вообще указателей, а не только их арифметики. Смещать указатель произвольно по всей памяти, увольте.
Если хотите получить char используйте указатель на char, а не size_t.
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?
NightmareZ
 Аватар для NightmareZ
1336 / 559 / 37
Регистрация: 31.03.2009
Сообщений: 1,907
27.08.2010, 13:21     Арифметика указателей #15
Цитата Сообщение от Owyn Посмотреть сообщение
я и не хочу, мне нужен указатель на size_t


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

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

Создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей C++
Арифметика указателей (указатель на void*) C++
Создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей C++

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

Или воспользуйтесь поиском по форуму:
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
27.08.2010, 16:26     Арифметика указателей #16
Вот образец неправильного (по идейным соображениям) кода, и в реальных программах никогда так не делайте, если только абсолютно не уверены, но для наглядности сгодится...
C
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <stddef.h>
 
int main(void){
    int i;
    int * p1 = &i;
    int * p2 = (int*)((ptrdiff_t)p1 - 5);
 
    printf("p1 = %p\np2 = %p\n", p1, p2);
 
    return 0;
}
Yandex
Объявления
27.08.2010, 16:26     Арифметика указателей
Ответ Создать тему
Опции темы

Текущее время: 20:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru