Как сделать «->» и «.»операции доступа к элементам отличаются в C - PullRequest
5 голосов
/ 06 августа 2010

Я посмотрел на некоторые ресурсы, чтобы сказать мне, как -> и . отличаются, но они, кажется, делают то же самое. -> действует как оператор точки на структуре?

Ответы [ 9 ]

17 голосов
/ 06 августа 2010

. используется, когда у вас есть структура, и -> используется, когда у вас есть указатель на структуру.Стрелка - это краткая форма для разыменования указателя, а затем использование .: p->field соответствует (*p).field.

7 голосов
/ 06 августа 2010

Это почти одно и то же.Единственное отличие состоит в том, что «->» принимает указатель на структуру слева, в то время как «.»принимает структуру;«->» задерживает (т.е. следует) указатель перед доступом к члену структуры.Итак,

struct foo bar;
bar.x = 0;

совпадает с:

struct foo bar;
struct foo *diddly = &bar;
diddly->x = 0;
2 голосов
/ 06 августа 2010

Ах, я только что столкнулся с тем же вопросом, когда смотрел на настройки локали. Один предназначен для доступа к атрибутам через указатель, а другой - для разыменованной структуры:

#include <locale.h>

int main (void) {

    struct lconv *locale_ptr; 
    locale_ptr = localeconv();
    printf("Currency symbol: %s\n", (*locale_ptr).currency_symbol);
}

эквивалентно:

int main (void) {

    struct lconv *locale_ptr; 
    locale_ptr = localeconv();
    printf("Currency symbol: %s\n", locale_ptr->currency_symbol);
}
2 голосов
/ 06 августа 2010

-> для указателя структуры то же, что . для структуры.

struct Data data;
data.content = 1;

struct Data* pData = &data;
pData->content = 2;
2 голосов
/ 06 августа 2010

вы используете точку при доступе к элементам объекта и стрелку -> при доступе к элементам через указатель на объект

1 голос
/ 06 августа 2010

[.] действует на объект структуры. Как только объект определенной структуры объявлен, оператор [.] Может использоваться для непосредственной работы с членами.

[->] работает с указателем на объект структуры. Это оператор разыменования, который используется исключительно с указателями на объекты с членами. Таким образом, мы можем получить доступ к членам объекта, на который у нас есть ссылка.

На основании декларации вы можете использовать эти операторы.

1 голос
/ 06 августа 2010

Язык C, в отличие от многих других языков, позволяет переменным иметь объекты (здесь структуры) в качестве значений, а также указатели на объекты в качестве значений. В зависимости от того, какой тип переменной используется, «.» или "->" должны использоваться соответственно.

1 голос
/ 06 августа 2010

Наиболее просто вы используете. при работе с самой структурой и -> при работе с указателем на структуру.

Показать в коде:

  struct s myStruct;
  myStruct.num = 5;

Действителен, но:

  struct s myStruct;
  myStruct->num = 5;

Недопустимо, поскольку myStruct не является указателем.

  struct s *myStruct;
  myStruct->num = 5;

Будет действительным.

Оператор -> на самом деле является сокращением для (* myStruct) .num;

0 голосов
/ 06 августа 2010

Оператор a-> b канонически означает (* a) .b. Так что, в отличие от ".", Он разыменует свой первый аргумент.

Я могу ошибаться в этом вопросе, но я понимаю, что это не «официально» часть C (вы конкретно упоминаете C в вопросе). Это конструкция C ++, которую большинство поставщиков компиляторов C добавили в C. Однако я должен признать, что я не поспевал за изменениями в C, так что я могу быть совершенно неправ в этом.

В C ++ есть и другие отличия. Оператор "->" перегружен, где как "." нет.

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