kochevkv 0 15 марта, 2019 Опубликовано 15 марта, 2019 · Жалоба Объясните зачем нужны беззнаковые указатели и тип вроде uint_ptr, если максимальный размер массива, который я могу объявить в Visual Studio равен INTPTR_MAX, т.е. половине UINTPTR_MAX. Есть ли ограничения в стандарте языка С на размер массива? Даже если есть платформы, в которых можно задать массив больше INTPTR_MAX, как получить доступ к элементам массива? При доступе к элементам массива через индекс [] значение в квадратных скобка приводится к intptr_t. Получится ли использовать арифметику беззнаковых указателей для доступа к элементам такого массива при индексе больше INTPTR_MAX? Вопрос скорее теоретический, но интересно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 15 марта, 2019 Опубликовано 15 марта, 2019 · Жалоба Мне кажется этот тип удобен например при работе с областями памяти для управления cache, контроллерами dma и mmu. Это не беезнаковый указатель. Это целочисленный тип достаточный по разрядности для того чтобы в него поместился указатель. Вроде так написано. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kochevkv 0 15 марта, 2019 Опубликовано 15 марта, 2019 (изменено) · Жалоба 9 minutes ago, GenaSPB said: Мне кажется этот тип удобен например при работе с областями памяти для управления cache, контроллерами dma и mmu. Это не беезнаковый указатель. Это целочисленный тип достаточный по разрядности для того чтобы в него поместился указатель. Вроде так написано. Да. Этот вариант применения понятен. Всё адресное пространство может быть больше, чем разрядность платформы. intptr_t я так понял синоним типа ptrdiff_t. Тогда да. Я про него говорю. Остаётся вопрос с доступом к элементам дальше PTRDIFF_MAX и бывают ли платформы с возможностью задать массив больше PTRDIFF_MAX Изменено 15 марта, 2019 пользователем kochevkv Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 15 марта, 2019 Опубликовано 15 марта, 2019 · Жалоба Нет не синоним. 3 minutes ago, kochevkv said: Всё адресное пространство может быть больше, чем разрядность платформы Да. Чтобы не выбирать между 16 32 64 бит типами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GeorgK 1 15 марта, 2019 Опубликовано 15 марта, 2019 · Жалоба Может я ошибаюсь, но речь шла скорее об указателе на знаковое или беззнаковое число. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 15 марта, 2019 Опубликовано 15 марта, 2019 (изменено) · Жалоба За точным определением в стандарт, а народ отвечает тут 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. Изменено 15 марта, 2019 пользователем GenaSPB Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 15 марта, 2019 Опубликовано 15 марта, 2019 (изменено) · Жалоба Если быть совсем буквоедом, никто не гарантирвет битового совпадения uintptr_t и указателя... так что арифметика это тоже машинно- зависиимый код. Изменено 15 марта, 2019 пользователем GenaSPB Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 15 марта, 2019 Опубликовано 15 марта, 2019 · Жалоба 3 часа назад, kochevkv сказал: зачем нужны беззнаковые указатели и тип вроде uint_ptr, Ну указатели они по своей природе вроде как беззнаковые. Потому и тип, в который указатель может быть засунут - беззнаковый. А вот разница между указателями может быть знаковой, потому и размер массива ограничен максимально возможной знаковой величиной, ибо по Стандарту допускается вычислять разницу между указателями на любые элементы одного массива. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться