Что операции поддерживаются необработанным указателем и указателем функции в C/C++?

Vim вводит режим вставки с помощью меня (или для добавляют), независимо от платформы. Режим перезаписи только редко вводится с помощью Сдвиг + r . Я никогда не использовал , Вставляют ключ здесь.

6
задан yesraaj 13 September 2009 в 16:18
поделиться

5 ответов

взгляните на это операции, которые определены в терминах 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;
14
ответ дан 8 December 2019 в 13:01
поделиться

Вы можете сравнивать указатели, если они указывают на одно и то же распределение. Например, если у вас есть два указателя, указывающие на элементы одного и того же массива, вы можете использовать для этих указателей операторы сравнения неравенства. С другой стороны, если у вас есть два указателя, указывающие на разные объекты, тогда сравнение будет "неопределенным", хотя на практике большинство компиляторов, вероятно, просто сравнивают адреса.

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
2
ответ дан 8 December 2019 в 13:01
поделиться

# 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; 
}
1
ответ дан 8 December 2019 в 13:01
поделиться

Операторы <,>, <=,> = поддерживаются для указателей, но гарантированно дают надежные результаты только в том случае, если два сравниваемых указателя являются частью одного и того же распределения памяти (например, при сравнении два указателя на индексы в размещении массива). Для них он указывает относительное положение в распределении (т. Е. Если a , используя только нижний 32 бита, если одно выделение не может превышать размер, разрешенный для 32-битного указателя). На самом деле это не имеет смысла в контексте указателей на функции, поскольку они не t адрес непрерывного выделения памяти.

Другие операции с необработанными указателями: == возвращает истину, если указатели указывают на один и тот же объект. - производит количество байтов между двумя указателями (думаю, подходит только для того же распределения?). + не компилируется, так как это было бы бессмысленно.

Для указателей функций они могут быть разыменованы * и вызваны.

Для функций указателя на член существуют операторы -> * и. *

1
ответ дан 8 December 2019 в 13:01
поделиться

Указатель является представлены как обычное целочисленное значение. Вы можете делать все с помощью указателей, что также разрешено для всех других числовых типов. + - * / << >> ==! = ^ & | ! ~%. Надеюсь, я ничего не забыл.

Указатель на функцию отличается только тем, что его можно вызвать с помощью оператора ().

0
ответ дан 8 December 2019 в 13:01
поделиться