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

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

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

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

27.08.2010, 11:41. Просмотров 3207. Ответов 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
мб я чего то не знаю о вычитании в математики?

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

арифметика указателей - 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 байта. Но взглянем на следующий код: ...

Арифметика. - C++
Для заданного целого числа N определить цифру а, наиболее часто встречающуюся в числе (задача целочисленной арифметики)Как задать кол-во...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
oxotnik
1589 / 1066 / 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
1339 / 562 / 37
Регистрация: 31.03.2009
Сообщений: 1,918
27.08.2010, 12:06     Арифметика указателей #4
Цитата Сообщение от Owyn Посмотреть сообщение
мб я чего то не знаю о вычитании в математики?
Пожалуй, да. Раздели 1136 на 284. Посмотри что получится, подумай, и начинай читать книжки по основам C/C++.
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 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
1339 / 562 / 37
Регистрация: 31.03.2009
Сообщений: 1,918
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
Эксперт С++
4933 / 2513 / 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));
зато теперь понял почему С++ делает фигню и что можно скастовать тип перед операцией чем мучать *опу
Это неправильный подход.
NightmareZ
1339 / 562 / 37
Регистрация: 31.03.2009
Сообщений: 1,918
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
Эксперт С++
4933 / 2513 / 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 байт.
NightmareZ
1339 / 562 / 37
Регистрация: 31.03.2009
Сообщений: 1,918
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
Эксперт С++
4933 / 2513 / 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.
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
1339 / 562 / 37
Регистрация: 31.03.2009
Сообщений: 1,918
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++
Дано натуральное число n. Вычислить: (1+1/1*1)+(1+1/2*2)+(1+1/3*3)+...+(1+1/n*n) Скажу всем спасибо!

Арифметика в C - C++
Дано натуральное число n. Проверить содержит ли оно три одинаковые цифры. Например 12322. Содержит. Помогите плиз...:(

Арифметика - C++
Даны x,y,z. Вычислить a,b если <a target="_blank" href="http://***********/F/s50.***********/i127/0911/47/4bd25a960645.jpg.html"><img...

Целочисленная арифметика - C++
на заданном отрезке натурального ряда чисел найти : 1. все простые числа; 2. все близнецы; 3. все совершенные числа; 4. все...

длинная арифметика - C++
решите задачку: пользователь вводит 2 больших числа (числа от -1*2^127 до 1*2^127-1). Написать программу для суммирования таких чисел.


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

Или воспользуйтесь поиском по форуму:
easybudda
Эксперт С++
9460 / 5473 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
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     Арифметика указателей
Ответ Создать тему
Опции темы

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