Положительный или отрицательный не является значимым аспектом типа указателя.Они относятся к целому числу со знаком, в том числе знаковому типу char, short, int и т. Д.
Люди, которые говорят об отрицательном указателе, в основном в ситуации, когда машинное представление указателя рассматривается как целочисленный тип.например, reinterpret_cast<intptr_t>(ptr)
.В этом случае они на самом деле говорят о приведенном целом числе.не сам указатель.
В некотором сценарии я думаю, что указатель по своей сути не подписан, мы говорим об адресе в терминах ниже или выше.0xFFFF.FFFF
выше 0x0AAAA.0000
, что интуитивно понятно для людей.хотя 0xFFFF.FFFF
на самом деле является «отрицательным», в то время как 0x0AAA.0000
является положительным.
Но в других сценариях вычитание указателя (ptr1 - ptr2)
приводит к знаковому значению, тип которого ptrdiff_t, оно несовместимо при сравнении свычитание целого числа, signed_int_a - signed_int_b
приводит к типу int со знаком, unsigned_int_a - unsigned_int_b
создает тип без знака.Но для вычитания указателя он создает тип со знаком, потому что семантика - это расстояние между двумя указателями, единица измерения - количество элементов.
В заключение я предлагаю рассматривать тип указателя как автономный тип, каждый тип имеет свой набороперации на нем.Для указателей (исключая указатель на функцию, указатель на функцию-член и void *):
- Элемент списка
+
, + =
ptr +any_integer_type
-
, - =
ptr - any_integer_type
ptr1 - ptr2
++ префикс и постфикс
- - префикс и постфикс
Обратите внимание, что для указателя нет операции / * %
.Также поддерживается то, что указатель должен обрабатываться как отдельный тип, а не «тип, похожий на int» или «тип, базовый тип которого int, поэтому он должен выглядеть как int».