Является ли (* exptr) -> cnt тем же, что и exptr-> cnt или (* exptr) .cnt? - PullRequest
0 голосов
/ 08 февраля 2019

(*pointer)->name совпадает с pointer->name или (*pointer).name?

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

В C оператор a->b является сокращением для (*a).b.

struct foo {
    int b;
};

// the . operator is used when the struct object is NOT a pointer
struct foo a;
a.b = 42;

// the -> operator is used when the struct object IS a pointer
struct foo *a = malloc(sizeof *a);
a->b = 42;

// the same thing as the above example, but using the dot operator
(*a).b = 42;

Последний пример - разыменование указателя a (получение объекта, на который он указывает), затем использование оператора точки для доступа к элементу b внутри него.Теперь давайте переведем ваш вопрос.

// first one
(*a)->b; 
// would be the same as:
(*(*a)).b;
// that is:
(**a).b;
// which would be used in
struct foo **a ... ;
(**a).b; // get the first element of the array, access field b


// second example
a->b;
// is the same as
(*a).b;
// which is your third example
0 голосов
/ 08 февраля 2019

Нет.

(*pointer)->name говорит: «Возьми то, на что pointer указывает.Получите структуру, на которую она указывает, и получите от нее член name ». Чтобы это работало, pointer должен быть указателем на указатель на структуру.Например, он мог быть объявлен как struct foo **pointer.

pointer->name, где говорится: «Получить структуру, на которую указывает pointer, и получить из нее элемент name». Чтобы это работало, pointer должен быть указателем на структуру.Его можно было бы объявить как struct foo *pointer.

(*pointer).name, который говорит «Получите структуру, на которую указывает pointer.Получите из него элемент name ». Он также должен быть pointer для структуры.

(Единственное отличие между двумя последними заключается в том, что второй использует один оператор в исходном коде. Операции фактическивыполняются одинаково.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...