Vim вводит режим вставки с помощью меня (или для добавляют), независимо от платформы. Режим перезаписи только редко вводится с помощью Сдвиг + r . Я никогда не использовал , Вставляют ключ здесь.
взгляните на это
операции, которые определены в терминах sizeof
типа указателя, не будут работать, к ним относятся:
void(*p)() = ...;
// all won't work, since `sizeof (void())` won't work.
// GCC has an extension that treats it as 1 byte, though.
p++; p--; p + n; p - n;
Унарный +
работает с любым типом указателя и просто вернет значение в нем нет ничего особенного для указателей на функции.
+ p; // works. the result is the address stored in p.
Наконец, обратите внимание, что указатель на функцию указатель больше не является указателем функции:
void (**pp)() = &p;
// all do work, because `sizeof (void(*)())` is defined.
pp++; pp--; pp + n; pp - n;
Вы можете сравнивать указатели, если они указывают на одно и то же распределение. Например, если у вас есть два указателя, указывающие на элементы одного и того же массива, вы можете использовать для этих указателей операторы сравнения неравенства. С другой стороны, если у вас есть два указателя, указывающие на разные объекты, тогда сравнение будет "неопределенным", хотя на практике большинство компиляторов, вероятно, просто сравнивают адреса.
char *text[] = "hello";
const char *e_ptr = strchr(text, 'e');
const char *o_ptr = strchr(text, 'o');
if (e_ptr < o_ptr) { ... } // this is legal
char *other_text[] = "goodbye";
const char *b_ptr = strchr(other_text, 'b');
if (b_ptr > o_ptr) { ... } // not strictly legal
# 1 : Указатели функций могут быть вызваны.
# 2 : Для указателей поддерживаются реляционные операторы, потому что вы можете использовать их в арифметике указателей и сравнивать адреса друг с другом. Практический пример: обход массива
int data[5] = { 1, 2, 3, 4, 5 };
// Increment pointer until it reaches the end-address.
for (int* i = data; i < data + 5; ++i) {
std::cout << *i << endl;
}
Операторы <,>, <=,> = поддерживаются для указателей, но гарантированно дают надежные результаты только в том случае, если два сравниваемых указателя являются частью одного и того же распределения памяти (например, при сравнении два указателя на индексы в размещении массива). Для них он указывает относительное положение в распределении (т. Е. Если a , используя только нижний 32 бита, если одно выделение не может превышать размер, разрешенный для 32-битного указателя). На самом деле это не имеет смысла в контексте указателей на функции, поскольку они не t адрес непрерывного выделения памяти.
Другие операции с необработанными указателями: == возвращает истину, если указатели указывают на один и тот же объект. - производит количество байтов между двумя указателями (думаю, подходит только для того же распределения?). + не компилируется, так как это было бы бессмысленно.
Для указателей функций они могут быть разыменованы * и вызваны.
Для функций указателя на член существуют операторы -> * и. *
Указатель является представлены как обычное целочисленное значение. Вы можете делать все с помощью указателей, что также разрешено для всех других числовых типов. + - * / << >> ==! = ^ & | ! ~%. Надеюсь, я ничего не забыл.
Указатель на функцию отличается только тем, что его можно вызвать с помощью оператора ().