Что такое тип данных uintptr_t

Что такое uintptr_t и для чего его можно использовать?

Это unsigned int, способный хранить указатель. Обычно это означает, что он имеет тот же размер, что и указатель.

Он может быть определен в стандартах C ++ 11 и более поздних версий.

Общей причиной того, что требуется целочисленный тип, который может содержать тип указателя архитектуры, – это выполнять целые операции с указателем или скрывать тип указателя, предоставляя его как целочисленный «дескриптор».

Редактировать: Обратите внимание, что у Стива Джессопа есть некоторые очень интересные дополнительные детали (которые я не буду красть) в другом ответе здесь для вас, педантичных типов 🙂

Во-первых, в то время, когда задавался вопрос, uintptr_t не был на C ++. Он находится в C99, в , в качестве необязательного типа. Многие компиляторы C ++ 03 предоставляют этот файл. Он также находится в C ++ 11, в , где снова он является необязательным, и который относится к C99 для определения.

В C99 он определяется как «целочисленный тип без знака с тем свойством, что любой действительный указатель на void может быть преобразован в этот тип, а затем преобразован обратно в указатель на void, и результат будет сравниваться с исходным указателем».

Возьмите это, чтобы понимать, что он говорит. Он ничего не говорит о размере.

uintptr_t может быть того же размера, что и void* . Это может быть больше. Вероятно, это может быть меньше, хотя такая реализация на C ++ приближается к извращению. Например, на некоторой гипотетической платформе, где void* – 32 бита, но используется только 24 бита виртуального адресного пространства, вы можете получить 24-разрядный uintptr_t который удовлетворяет этому требованию. Я не знаю, почему реализация будет делать это, но стандарт позволяет это.

Это целое число без знака, равное размеру указателя. Всякий раз, когда вам нужно делать что-то необычное с помощью указателя – например, инвертировать все биты (не спрашивайте, почему), вы uintptr_t его на uintptr_t и манипулируете им как обычное целое число, а затем отбрасываете.

Уже есть много хороших ответов на часть «что такое тип данных uintptr_t». Я попытаюсь решить, для чего он может быть использован? в этом посте.

В основном для побитовых операций с указателями. Помните, что в C ++ нельзя выполнять побитовые операции с указателями. По причинам см. Почему вы не можете выполнять побитовые операции с указателем в C, и есть ли способ обойти это?

Таким образом, для выполнения поразрядных операций над указателями нужно было бы наложить указатели на тип unitpr_t, а затем выполнить побитовые операции.

Вот пример функции, которую я только что написал, чтобы сделать побитовое исключение или 2 указателя для хранения в связанном списке XOR, чтобы мы могли перемещаться в обоих направлениях, как дважды связанный список, но без штрафа за сохранение 2 указателей в каждом узле ,

  template  T* xor_ptrs(T* t1, T* t2) { return reinterpret_cast(reinterpret_cast(t1)^reinterpret_cast(t2)); } 
  • Создать новый объект C ++ по определенному адресу памяти?
  • Указатель против ссылки
  • Указатель на 2d-массив
  • Размещение звездочки в объявлениях указателей
  • Псевдонимы, вызываемые разыменованием, нарушат правила строгого сглаживания
  • Передача 2D-массива функции C ++
  • Как печатать переменные адреса в C?
  • Указатели в c ++ после удаления
  • Можно ли программно определить размер массива C ++? А если нет, то почему?
  • Неинициализированные указатели в коде
  • Почему бы не использовать указатели для всего на C ++?
  • Interesting Posts

    С MySQL, как я могу создать столбец, содержащий индекс записи в таблице?

    Преобразовать целое число в двоичное в C #

    C: Приведение минимального 32-битного целого числа (-2147483648) к float дает положительное число (2147483648.0)

    Шаблоны проектирования для преобразования рекурсивных алгоритмов в итеративные

    Как программно или динамически создавать составной компонент в JSF 2

    Почему == сравнения с Integer.valueOf (String) дают разные результаты для 127 и 128?

    Можно ли сделать Ctrl + C восприимчивым, как Ctrl + Break в консоли Windows 7?

    Сценарий Linux iptables для блокировки всего доступа в Интернет, за исключением желаемых приложений

    Переполнение текста CSS в ячейке таблицы?

    Алгоритм для получения всех комбинаций размера n из массива (Java)?

    demote boost :: function to plain function pointer

    Объясните Моррису обход дерева без использования стеков или рекурсии

    Что означает приоритет в Firebase?

    Скомпилируйте код полностью в памяти с помощью javax.tools.JavaCompiler

    Вопросы об объекте Entity Framework Context Lifetime

    Давайте будем гением компьютера.