4 / 3 / 1
Регистрация: 28.07.2009
Сообщений: 134
1

MS VS-2017 - void* и ptrdiff_t

23.04.2020, 19:10. Показов 549. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В чем разница между

ptrdiff_t ptr;
и
void* ptr;
?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.04.2020, 19:10
Ответы с готовыми решениями:

System.Void из C# использоваться не может - для получения объекта типа void используйте typeof (void)
Изучаю с# по "Шилдт Г. - C# 4.0 полное руководство" При изучении конструктора возникла проблема:...

Реализовать аналог `void *memmove(void *to, void *from, size_t n)`
Добрый день, подскажите пожалуйста, как реализовать такой метод самостоятельно? который копирует...

Как определять ptrdiff_t ?
Данный тип меняется в зависимости от разрядности приложения, есть нечто в сишарпе, если нет, то как...

Положительное смещение: size_t vs ptrdiff_t
void foo(char* pBuffer, std::size_t size) { for (??? pos = 0; pos < size; pos++) ...

14
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
23.04.2020, 19:37 2
Цитата Сообщение от ezus Посмотреть сообщение
В чем разница между
Примерно в том же, в чём и между
C++
1
int ptr;
и
C++
1
void* ptr;
0
4 / 3 / 1
Регистрация: 28.07.2009
Сообщений: 134
23.04.2020, 20:02  [ТС] 3
Но int это всегда 32 бита, а void* и ptrdiff_t зависят от платформы.

я уточню вопрос: ptrdiff_t и void* взаимозаменяемы или нет?
0
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
23.04.2020, 20:05 4
Цитата Сообщение от ezus Посмотреть сообщение
я уточню вопрос: ptrdiff_t и void* взаимозаменяемы или нет?
ptrdiff знаковый, а void * - беззнаковый. А так - они одного размера, заменяй.
1
4 / 3 / 1
Регистрация: 28.07.2009
Сообщений: 134
23.04.2020, 20:33  [ТС] 5
Т.е ptrdiff_t обеспечивает размер только до 2^31?
0
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
23.04.2020, 20:36 6
Цитата Сообщение от ezus Посмотреть сообщение
Т.е ptrdiff_t обеспечивает размер только до 2^31?
Ну да, либо 2^63, плюс знак
1
4 / 3 / 1
Регистрация: 28.07.2009
Сообщений: 134
25.04.2020, 19:16  [ТС] 7
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
ptrdiff знаковый, а void * - беззнаковый. А так - они одного размера, заменяй.
К сожалению, опыт показывает на обратное.

Сейчас я понимаю так: void * - это собственно указатель, а ptrdiff - это только место в памяти под указатель, и использование его в качестве указателя дает ошибку.

Я прав или нет?
0
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
25.04.2020, 19:19 8
Цитата Сообщение от ezus Посмотреть сообщение
Сейчас я понимаю так: void * - это собственно указатель, а ptrdiff - это только место в памяти под указатель, и использование его в качестве указателя дает ошибку.
ptrdiff_t - это разница между двумя указателями.
Покажи, что ты пытаешься сделать
0
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
25.04.2020, 19:24 9
ezus, void* и ptrdiff это разные типы, объясни что сделать хочешь?

Добавлено через 3 минуты
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
void * - беззнаковый
стандарт языка говорит лишь что можно преобразовать указатель в целочисленный тип(достаточного размера) и обратно с сохранением значения. Про представление указателя ничего вроде не говорится( разве что два указателя, указывающие на один адрес, могут иметь разные значения)
0
4 / 3 / 1
Регистрация: 28.07.2009
Сообщений: 134
25.04.2020, 20:01  [ТС] 10
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Покажи, что ты пытаешься сделать
Раньше как-то такие вопросы не возникали, но переход на 64 их поставил.
Можно ли вместо void* использовать что-то типа ptrdiff_t, PINT_PTR и т.п. для определения переменных, а не только места под хранение указателя?

Цитата Сообщение от zayats80888 Посмотреть сообщение
Про представление указателя ничего вроде не говорится( разве что два указателя, указывающие на один адрес, могут иметь разные значения)
Это интересно! Как это может быть? Это слабые указатели, свопинг или что-то другое?
0
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
25.04.2020, 20:06 11
Цитата Сообщение от ezus Посмотреть сообщение
Можно ли вместо void* использовать что-то типа ptrdiff_t, PINT_PTR и т.п. для определения переменных, а не только места под хранение указателя?
Пример кода можно? А то не очень понятно...
Цитата Сообщение от ezus Посмотреть сообщение
Это интересно! Как это может быть?
Это как удобнее компилятору будет, так он и сделает.
Вкратце тут почитай.
0
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
25.04.2020, 20:11 12
Цитата Сообщение от ezus Посмотреть сообщение
Можно ли вместо void* использовать что-то типа ptrdiff_t, PINT_PTR и т.п. для определения переменных, а не только места под хранение указателя?
Используй intptr_t, он как раз для этих целей предназначен
0
4 / 3 / 1
Регистрация: 28.07.2009
Сообщений: 134
25.04.2020, 21:05  [ТС] 13
Спасибо.
Вы подтолкнули меня на другой взгляд, и , похоже, мне стало понятно в чем я запутался. Пойдем дальше.

Добавлено через 51 минуту
И снова вопрос.

Для "unsigned int" советуют использовать size_t, как платформо-независимый тип.
А какой тип лучше использовать для signed int?
0
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
25.04.2020, 21:15 14
Цитата Сообщение от ezus Посмотреть сообщение
А какой тип лучше использовать для signed int?
intptr_t
1
19 / 61 / 13
Регистрация: 11.06.2018
Сообщений: 212
25.04.2020, 23:21 15
ezus, https://www.viva64.com/ru/a/0004/

Добавлено через 4 минуты
Цитата Сообщение от ezus Посмотреть сообщение
Можно ли вместо void* использовать что-то типа ptrdiff_t
Звучит настораживающе. void* - это указатель, а ptrdiff_t - нет.

Что такое size_t и ptrdiff_t
intptr_t
0
25.04.2020, 23:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.04.2020, 23:21
Помогаю со студенческими работами здесь

В чем разница между uinptr_t, size_t, ptrdiff_t
В чем разница между uinptr_t, size_t, ptrdiff_t. Когда и какой из типов использовать и могут ли они...

Ошибка cannot convert from type void*(classname::) () to type void*(*)(void*)
Подскажите пожалуйста как избавиться от ошибки? Есть ещё какой-либо способ, кроме как объявить...

Void menu(void); что это ? почему не void menu();
void menu(void); что это ? почему не void menu(); void naprimer(void); и это идет в классе это...

Для чего нужна функция void interrupt(void) и как её использовать?
Любую функцию сначать надо определить потом вызвать скажем так: int simple_function ()...

Дважды вычислить значение выражения, используя функции возвращающие void и не void
Хай!Помогите решить Дважды вычислить значение выражения, используя функции возвращающие void...

Как написать это - void fastcall TForml:oOp(void)?
Добрый день! Подскажите пожайлуста: Как написать это - void fastcall TForml:: DoOp(void)? Как...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru