Перейти к содержанию
    

Зачем нужны беззнаковые указатели?

Объясните зачем нужны беззнаковые указатели и тип вроде uint_ptr, если максимальный размер массива, который я могу объявить в Visual Studio равен INTPTR_MAX, т.е. половине UINTPTR_MAX. Есть ли ограничения в стандарте языка С на размер массива?

Даже если есть платформы, в которых можно задать массив больше INTPTR_MAX, как получить доступ к элементам массива? При доступе к элементам массива через индекс [] значение в квадратных скобка приводится к intptr_t. Получится ли использовать арифметику беззнаковых указателей для доступа к элементам такого массива при индексе больше INTPTR_MAX?

Вопрос скорее теоретический, но интересно. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне кажется этот тип удобен например при работе с областями памяти для управления cache, контроллерами dma   и   mmu.

Это не беезнаковый указатель. Это целочисленный тип достаточный по разрядности для того чтобы в него поместился указатель. Вроде так написано.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 minutes ago, GenaSPB said:

Мне кажется этот тип удобен например при работе с областями памяти для управления cache, контроллерами dma   и   mmu.

Это не беезнаковый указатель. Это целочисленный тип достаточный по разрядности для того чтобы в него поместился указатель. Вроде так написано.

Да. Этот вариант применения понятен. Всё адресное пространство может быть больше, чем разрядность платформы.

intptr_t я так понял синоним типа ptrdiff_t. Тогда да. Я про него говорю.

 

Остаётся вопрос с доступом к элементам дальше PTRDIFF_MAX и бывают ли платформы с возможностью задать массив больше PTRDIFF_MAX

Изменено пользователем kochevkv

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет не синоним. 

3 minutes ago, kochevkv said:

Всё адресное пространство может быть больше, чем разрядность платформы

Да. Чтобы не выбирать между 16 32 64 бит типами.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может я ошибаюсь, но речь шла скорее об указателе на знаковое или беззнаковое число.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

За точным определением в стандарт, а народ отвечает тут
 

7.18.1.4 Integer types capable of holding object pointers
1 The following type designates a signed integer type with the property that any valid
pointer to void can be converted to this type, then converted back to pointer to void,
and the result will compare equal to the original pointer:
intptr_t
The following type designates an unsigned integer type with the property that any valid
pointer to void can be converted to this type, then converted back to pointer to void,
and the result will compare equal to the original pointer:
uintptr_t
These types are optional.

Изменено пользователем GenaSPB

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если быть совсем буквоедом, никто не гарантирвет битового совпадения uintptr_t и указателя... так что арифметика это тоже машинно- зависиимый код.

Изменено пользователем GenaSPB

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, kochevkv сказал:

зачем нужны беззнаковые указатели и тип вроде uint_ptr,

Ну указатели они по своей природе вроде как беззнаковые.  Потому и тип, в который указатель может быть засунут - беззнаковый. А вот разница между указателями может быть знаковой, потому и размер массива ограничен максимально возможной знаковой величиной, ибо по Стандарту допускается вычислять разницу между указателями на любые элементы одного массива.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...