Это не имеет никакого отношения к статическому или динамическому связыванию.
См. C++'s operator precedence. .
имеет более низкий приоритет, чем *
, так что на самом деле разница между *ptr.fld
и ptr->fld
. Например, следующий код демонстрирует:
#include <iostream>
struct foo {
int f;
};
int main() {
struct foo *p = new struct foo;
p->f = 42;
std::cout << p->f << std::endl;
std::cout << (*p).f << std::endl;
// The following will not compile
// std::cout << *p.f << std::endl;
}
Как Джон Knoeller указывает, ptr->fld
является синтаксически (*(ptr)).fld
, но это не то же самое, как *ptr.fld
, который будет на самом деле оценить в *(ptr.fld)
, вероятно, не то, что вы хотите.
Вы должны использовать ptr->fld
, если у вас есть указатель на структуру и хотите получить доступ к содержащемуся в ней поле. (*(ptr)).fld
означает то же самое, но не такое аккуратное. Вы должны использовать *strct.fld
, если у вас есть структура, а не указатель на структуру, которая содержит поле (fld
), которое является указателем, который вы хотите разыменовать. Пример ptr->fld
показан выше. Случай *strct.fld
может использоваться со следующей структурой:
struct foo {
int *fld;
}
struct foo f;
f.fld = new int;
*f.fld = 42;
Вы имели в виду '(* ptr) .field' или' * ptr.field'? Если вы действительно имели в виду '* ptr.поле ", то эти две формы просто не имеют ничего общего, что делает вопрос практически бессмысленным. – AnT
i mean (* ptr) .field – aharon
От вашего редактирования: ответ будет таким же. Смотри ниже. –